c语言字符串str,c语言中strtok函数
功能原型:
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函数时,它会用NULL替换s字符串中出现在delim中的所有字符。然后依次调用strtok(NULL,delim)得到每个部分的子串。
角色:
一个字符串被分解成一组字符串。s是要分解的字符串,delim是分隔符字符串。
描述:
Strtok()用于将一个字符串分割成多个片段。参数s指向要拆分的字符串,参数delim是拆分后的字符串。strtok()在参数s的字符串中找到参数delim的拆分字符时,会将其改为\0字符。在第一次调用中,strtok()必须给参数s一个字符串,后面的调用会将参数s设置为NULL。每次成功调用都返回下一个分段字符串指针。
返回值:
从s开始的分段字符串。如果没有拆分字符串,则返回NULL。
delim中包含的所有字符都将被过滤掉,过滤掉的地方将被设置为拆分节点。(如下例所示,您可以修改seps中的数据,然后查看输出结果)
#包含字符串. h
#包含stdio.h
char string[]=一个字符串\tof,个标记\ n和一些其他标记;
char seps[]=,\ t \ n ;
char * token
int main( void)
{
printf( %s\n\nTokens:\n ,string);
/*建立字符串并获取第一个令牌:*/
token=strtok( string,seps);
而(token!=空)
{
/*而“字符串”中有标记*/
printf( %s\n ,标记);
/*获取下一个令牌:*/
token=strtok( NULL,seps);
}
返回0;
}
总结:
Strtok在内部记录最后一个调用字符串的位置,因此它不支持多线程。可重入版本是strtok _ r,有兴趣可以研究一下。它适用于拆分的关键字在字符串之间“单个”或“连续”在一起的情况。
strsep:
#包含字符串. h
#包含stdio.h
char string[]=一个字符串\tof,个标记\ n和一些其他标记;
char seps[]=,\ t \ n ;
char *token,* s;
int main( void)
{
printf( %s\n\nTokens:\n ,string);
/*建立字符串并获取第一个令牌:*/
s=字符串;
token=strsep( s,seps);
而(token!=空)
{
/*而“字符串”中有标记*/
printf( %s\n ,标记);
/*获取下一个令牌:*/
token=strsep( s,seps);
}
返回0;
}
为什么使用strtok时子串中间没有换行符,而strsep有多个换行符?文件中有如下解释:
strsep和strtok_r之间的一个区别是,如果输入字符串包含更多
则strsep会为每个字符返回一个空字符串
分隔符中的一对字符。这意味着一个程序通常应该测试
for strsep在处理之前返回一个空字符串。
如果输入字符串中有属于delim的连续字符(逗号空格、感叹号空格等就是这种情况。在此示例中),strtok将返回NULL,而strsep将返回空字符串“”。所以如果要用strsep函数拆分字符串,就要判断返回值是否为空字符串。这解释了为什么strsep的例子中有多个换行符。
改进的代码:
效果:
其中字符 \ 0 的十进制数为0,宏定义为空。
下面的描述摘自最新的Linux内核2.6.29,说明strtok()已经不再使用,取而代之的是更快的strsep()。
/** linux/lib/string.c**版权所有(C) 1991,1992 Linus Torvalds*/
/**愚蠢的库例程.通常应该可以找到优化的版本
*作为asm-xx/string.h中的内联代码
*这些也有问题.
* * Fri 1999年6月25日,Ingo Oeser ioe @ informatik . tu-chemnitz . de
* -添加了strsep(),它将很快取代strtok()(因为strsep()是
*可重入且应该更快)。请在新代码中仅使用strsep()。
* * * 2002年2月9日星期六,杰森托马斯jason@topic.com.au,
*马修霍金斯matt@mh.dropbear.id.au
* -吻别strtok()
*/
总结:
strsep的返回值是拆分的开始字符串,函数的第一个参数指针指向拆分的剩余字符串。它适用于split关键字在两个字符串之间只严格出现一次的情况。
PS:
因为原始的字符串变量会在函数内部被修改,所以传入的参数不能是不可变的字符串(即文字常量区域)。
例如,char * token remain= abcdefghij //在编译时是文字常量,不能修改。
strtok(tokenremain, CDE );
strsep( tokenremain, CDE );
如果它被编译,运行时将报告一个段错误。
转载请联系作者授权,否则将追究法律责任。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。