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

本文最后更新于2016年10月24日,已超过 1 年没有更新,如果文章内容失效,还请反馈给我,谢谢!

=Start=

正文:

参考解答:

函数原型:
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函数将返回delim分隔符前面的字符串,s将指向分隔符之后的字符串

测试代码:

&

&

&

&

为什么用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。因为:

* – Added strsep() which will replace strtok() soon (because strsep() is reentrant and should be faster). Use only strsep() in new code, please.

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

参考链接:

=END=

声明: 除非注明,ixyzero.com文章均为原创,转载请以链接形式标明本文地址,谢谢!
https://ixyzero.com/blog/archives/2848.html

《C语言的 strtok 和 strsep 函数的使用》上有3条评论

  1. 深究strtok系列函数
    http://answerywj.com/2019/05/21/man-strtok/

    1. 函数说明
    1.1. 说明
    1.2. 参数
    1.3. 返回值
    2. 示例
    3. 使用注意事项
    3.1. 不会生成新的字符串,只是在源字符串上做了修改,源字符串会发生变化
    3.2. 第一个参数不可为字符串常量
    3.3. 若在第一次提取子串后,继续对源字符串进行提取,应在其后的调用中将第一个参数置为空值NULL
    3.4. 第二个参数是分割符的集合,支持多个分割符
    3.5. 若首字符为分割符,则会被忽略
    3.6. strtok为不可重入函数,使用strtok_r更灵活和安全
    4. 源码
    5. Reference

发表评论

电子邮件地址不会被公开。 必填项已用*标注