函数原型:

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)得到各部分子串。

作用:

分解字符串为一组字符串。s为要分解的字符串,delim为分隔符字符串。

说明:

strtok()用来将字符串分割成一个个片段。参数s指向欲分割的字符串,参数delim则为分割字符串,当strtok()在参数s的字符串中发现到参数delim的分割字符时则会将该字符改为\0 字符。在第一次调用时,strtok()必需给予参数s字符串,往后的调用则将参数s设置成NULL。每次调用成功则返回下一个分割后的字符串指针。

返回值:

从s开头开始的一个个被分割的串。当没有被分割的串时则返回NULL。

所有delim中包含的字符都会被滤掉,并将被滤掉的地方设为一处分割的节点。(如下面的例子,可修改 seps里面的数据,然后看输出结果)

#include #include

char string[] ="A string\tof ,,tokens\nand some more tokens";char seps[] =",\t\n";char *token;int main( void)

{

printf("%s\n\nTokens:\n", string);/*Establish string and get the first token:*/token= strtok( string, seps );while( token !=NULL )

{/*While there are tokens in "string"*/printf("%s\n", token );/*Get next token:*/token=strtok( NULL, seps );

}return 0;

}

总结:

strtok内部记录上次调用字符串的位置,所以不支持多线程,可重入版本为strtok_r,有兴趣的可以研究一下。它适用于分割关键字在字符串之间是“单独”或是 “连续“在一起的情况。

strsep:

#include #include

char string[] ="A string\tof ,,tokens\nand some more tokens";char seps[] =",\t\n";char *token, *s;int main( void)

{

printf("%s\n\nTokens:\n", string);/*Establish string and get the first token:*/s=string;

token= strsep( &s, seps );while( token !=NULL )

{/*While there are tokens in "string"*/printf("%s\n", token );/*Get next token:*/token= strsep( &s, seps );

}return 0;

}

为什么用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的例子中有多个换行的原因。

改进后的代码:

效果:

其中,  字符‘\0’  的 10进制数为0 , 宏定义为NULL  。

下面的说明摘自于最新的Linux内核2.6.29,说明了strtok()已经不再使用,由速度更快的strsep()代替。

/** linux/lib/string.c** Copyright (C) 1991, 1992 Linus Torvalds*/

/** stupid library routines.. The optimized versions should generally be found

* as inline code in

* These are buggy as well..

* * Fri Jun 25 1999, Ingo Oeser

* - Added strsep() which will replace strtok() soon (because strsep() is

* reentrant and should be faster). Use only strsep() in new code, please.

** * Sat Feb 09 2002, Jason Thomas ,

* Matthew Hawkins

* - Kissed strtok() goodbye

*/

总结:

strsep返回值为分割后的开始字符串,并将函数的第一个参数指针指向分割后的剩余字符串。它适用于分割关键字在两个字符串之间只严格出现一次的情况。

PS:

因为函数内部会修改原字符串变量,所以传入的参数不能是不可变字符串(即文字常量区)。

如 char *tokenremain ="abcdefghij"//编译时为文字常量,不可修改。

strtok(tokenremain,"cde");

strsep(&tokenremain,"cde");

编译通过,运行时会报段错误。

c语言strsep,C/C++ 字符串分割: strtok 与 strsep 函数说明(示例代码)相关推荐

  1. c语言 字符串分隔,c语言字符串分割–strtok | 逗号分隔-huangea的博客

    c语言字符串分割–strtok | 逗号分隔 代码,原理是使用字符串分隔函数 Strtok()函数详解: 该函数包含在"string.h"头文件中 函数原型: char* strt ...

  2. PHP 字符串分割 explode 与 str_split 函数

    PHP 字符串分割 用于分割字符串. 相关函数如下: ·        explode():使用一个字符串分割另一个字符串 ·        str_split():将字符串分割到数组中 explod ...

  3. C语言中把小写字符串转换成大写用函数,一个容易的将小写字符串转换成大写的函数...

    一个简单的将小写字符串转换成大写的函数 我用的是VC++6.0,恳请大家帮忙看看到底哪里出错了. #include void uppers(char *Dest,char *Sour) { while ...

  4. C语言输入一串数字字符串,C语言——输入一个字符串,将连续数字字符转换为数字(示例代码)...

    输入一个字符串,内有数字和非数字字符,例如: A123cdf 456.78cpc876.9er 849.1 将其中连续的数字作为一个实数,依次存放到一数组a中.例如123存放在a[0],456.78存 ...

  5. c语言虚参传递字符串,c语言中,一个函数作为另一个函数的虚参是什么意思? 先谢了...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 呵呵,这里是用来传递参数的,但是他传递的是一个指针,但是这个指针不是指向一个值的地址.而是指向一个函数的首地址,这个函数是什么格式呢?就由申明的时候一起给 ...

  6. c语言apply函数,R语言apply()函数用法(示例代码)

    在R语言的帮助文档里,apply函数的功能是: Retruns a vector or array or list of values obtained by applying a function ...

  7. c语言 复制二维数组,C语言 二维数组复制、清零及打印显示(示例代码)

    #include #include#include //二维整型数组打印显示 void printarr2d(int (*a)[3],int row,intcol) {inti,j;for(i=0; ...

  8. c语言scanf错误c4996,C语言杂谈(一)scanf()、scanf_s()与错误 C4996(示例代码)

    错误 C4996 初学C语言时,第一个接触到的I/O函数便是scanf()了.但在高版本的 Visual Studio (包括但不限于2015.2013.2012)编译代码时,却会出现意想不到的错误. ...

  9. c语言 串口连读,完美发音进阶课-连读技巧(示例代码)

    配套视频: 教学视频 辅音对元音的连读 什么是元音,辅音? 元音:气流在发出的过程当中,声带振动,口型相对固定,气流冲口而出,饱满而又洪亮.相当于韵母. 例如:[i:].[i].[?:].[?].[u ...

最新文章

  1. python逐行读取文本
  2. CSS:超出部分省略号
  3. python csv 中文乱码_python读写csv时中文乱码问题解决办法
  4. chkdsk 检查卷位图时发现损坏_如何修复Windows 10引导记录损坏故障
  5. Visual Studio 2019 16.1发布,更快更高效
  6. ETL异构数据源Datax_日期增量同步_13
  7. java exec mvn_为`mvn exec:java`设置Java属性
  8. 爬虫python能做什么-Python 爬虫学到什么样就可以找工作了?
  9. 中文 哈工大_第六届中文语法错误诊断大赛,哈工大讯飞联合实验室再获多项冠军...
  10. Kafka 几个实现细节
  11. android 加密dex,App加固(dex加密)
  12. matlab中的求导函数diff
  13. C语言之printf输出各种格式
  14. U盘安装CentOS 7解决方案 (fat系统文件4g限制)
  15. Linux SSH 远程登录错误解决办法 WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!
  16. 教师备课计算机教师管理制度,计算机学院教学过程管理中教师职责与问责暂行规定--中地大计字[2016]03号...
  17. 遗传算法学习笔记01
  18. 利用OneDrive网盘建站
  19. SAP FI02和FI12银行主数据的维护
  20. 字节跳动核心竞争力到底是什么?

热门文章

  1. UrlBase64加密解密
  2. Learn OpenCV ---- 大津法(Otsu‘s)阈值
  3. linux处理kdevtmpfsi,kswapd0(挖矿病毒清除)
  4. Lecture 1:Introduction to Systems Analysis and Design
  5. 存量阅读+增量阅读,助你在学术研究的海洋上乘风破浪
  6. HBase冠字号查询系统(实训报告)
  7. LUA教程(游戏UI制作)二
  8. 用迅雷下载Genymotion的virtual device的办法
  9. bit比特与字节Byte的区别和联系
  10. Python-第一周作业-循环练习题