strsep 是lib 函数 ,他的主要作用是分割字符串, 和strtok 的作用相同。但是有区别。
我们主要去看一下strsep 的用法, 因为现在好多地方都放弃了strtok
先来一个例子
char test[64]="7,8,9,";
char *p = NULL, *p_str=NULL;
char tem[]=",“;
int i = 0;
p_str=test;
p=strsep(&p_str,tem);
while(p )
{
printf("i=%d====/p=%s/ /p_str=%s/\n",i,p,p_str)
i++;
p=strsep(&p_str,tem);
}
这种情况会返回什么,
结果为: i=0=====/p=7/ /p_str=8,9,/
i=1=====/p=8/ /p_str=9,/
i=3=====/p=9/ /p_str=/
i=4=====/p=/ /p_str=NULL/
是不和奇怪 为什么还会又i=4 这一条打印出来!!! 百思不得其解。
看看 string.c 中关于 strsep 的实现就明白了。
就是 strsep 即使没有分个到 第一次也是返回 原字符串的 在最后一个分割后是空串 所以返回空串。 所以才有了 最后 i=4 的打印。
因此 我们必须 再使用 strsep 时 自己来检查 分割后的字串的 合法行。
我们把while(p ) 换成 while(p != NULL && strcmp(p,"")!=0)
或者我们把char test[64]="7,8,9,"; 改成 char test[64]="7,8,9"; 最后一个逗号自己去掉 也没有问题。 注意这个9, 的最后是有一个空字符串的。
这样既可以避免 再最后一次分割时 返回的时空串。
这里要注意 空字符串和 空格时两种概念。 空串 表示 "\0", strcmp 比较用"" 而空格 指的时 “ ”
1、表示区别
string str1 = ""; //空字符串 str1.length() 等于 0
string str2 = null; //NULL
string str3 = " "; //空格串 str2.length() 等于 1
2、内存区别
"" :分配了内存 ,分配了一个空间
null :未分配内存
" " :分配了内存