linux string strsep


原文链接: linux string strsep

C语言的 strtok 和 strsep 函数的使用

strsep()相比strtok()来说,它是可重入(reentrant)的(更安全),且速度更快。

/* lib/string.c */

strsep函数用于分割字符串

该函数同strtok函数类似,用来替换strtok函数

char *strsep(char **s, const char *delim);

s为指向欲分割的字符串,delim为分隔符,函数将返回分隔符前面的字符串,s将指向分隔符之后的字符串,实例如下:

#include

#include

int main(void)
{
        char s[] = "hello world!";
        char *p = s;
        char *d = " ";
        printf("%s\n", strsep(&p, d));
        printf("%s\n", p);

        return 0;
}

函数打印如下:

hello
world!

函数原型:
char *strtok(char *s, const char *delim);
char *strsep(char **s, const char *delim);

       功能:strtok和strsep两个函数的功能都是用来分解字符串为一组字符串。s为要分解的字符串,delim为分隔符字符串。
       返回值:从s开头开始的一个个子串,当没有分割的子串时返回NULL。
       相同点:两者都会改变源字符串,想要避免,可以使用strdupa(由allocate函数实现)或strdup(由malloc函数实现)。

strtok函数第一次调用时会把s字符串中所有在delim中出现的字符替换为NULL。然后通过依次调用strtok(NULL, delim)得到各部分子串。

测试代码:

        对于strsep有如下例子:

#include <stdio.h>
#include <string.h>
 
int main(void) {
	char source[] = "hello, world! welcome to china!";
	char delim[] = " ,!";
 
	char *s = strdup(source);
	char *token;

	for(token = strsep(&s, delim); token != NULL; token = strsep(&s, delim)) {
		printf(token);
		printf("+");
	}
	printf("\n");
	return 0;
}

输出结果为:hello++world++welcome+to+china++

#include <stdio.h>
#include <string.h>
 
int main(void) {
	char s[] = "hello, world! welcome to china!";
	char delim[] = " ,!";
 
	char *token;
    
	for(token = strtok(s, delim); token != NULL; token = strtok(NULL, delim)) {
		printf(token);
		printf("+");
	}
	
	while((token = strsep(&buf, ":")) != NULL){
  	printf("%s/n", token);
  }
	printf("\n");
	return 0;
}




输出结果为:hello+world+welcome+china+

       为什么用strtok时子串中间只有一个“+”,而strsep却有多个"+"呢?文档中有如下的解释:

One difference between strsep and strtok_r is that if the input string contains more
than one character from delimiter in a row strsep returns an empty string for each
pair of characters from delimiter. This means that a program normally should test
for strsep returning an empty string before processing it.

       大意是:如果输入的串的有连续的多个字符属于delim,(此例source中的逗号+空格,感叹号+空格等就是这种情况),strtok会返回NULL,而strsep会返回空串""。因而我们如果想用strsep函数分割字符串必须进行返回值是否是空串的判断。这也就解释了strsep的例子中有多个"+"的原因。

       我们在自己的程序中最好尽量避免使用strtok,转而使用strsep。

       下面的说明摘自于最新的Linux内核2.6.29,说明了strtok()已经不再使用,由速度更快的strsep()代替。
————————————————
版权声明:本文为CSDN博主「yafeng_jiang」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/yafeng_jiang/article/details/7109285

`