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

c语言strsep,C/C++ 字符串分割: strtok 与 strsep 函数说明(示例代码)函数原型:char*strtok(char*s,constchar*delim);char*strsep(char**s,constchar*delim);功能:strtok和strsep两个函数的功能都是用来分解字符串为一组字符串。s为要分解的字符串,delim为分隔符字符串。返回值:从s开头开始的一个个子串,当没有分割的子串时返回NULL。相同点:两者都会改变源字符串,想要…

函数原型:

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;

}

a51bc71f75510155e94a51a6b8c94237.png

总结:

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;

}

d02db7f9e92f687940540931ae1f2911.png

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

改进后的代码:

a14f2500fd01751afe93a045a5585a7b.png

效果:

94e2b1bbe2d5ec666d1effa72005f262.png

其中,  字符‘\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”);

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/213431.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长

相关推荐

  • mysql存储引擎

    mysql存储引擎mysql存储引擎

    2022年4月24日
  • TreeView的RenderControl的问题「建议收藏」

    TreeView的RenderControl的问题「建议收藏」TreeView,这东西,正常情况下一般是不用的,不过我们的美工,没弄个树型的样式出来,没折,将就用一下TreeView了说重点:环境搭建:一页面,拖一下TreeView控件上去,随便添加几个项。然后Page_Load事件里输出:CodeSystem.IO.StringWritersw=newSystem.IO.StringWriter();…

    2022年7月20日
  • 数据结构之栈

    一标准库stack的使用(1)stack成员函数(2)示例二C++实现栈数组实现的栈,能存储任意类型的数据

    2021年12月19日
  • linux系统nginx启动_电脑更新时重启电脑会怎样

    linux系统nginx启动_电脑更新时重启电脑会怎样Nginx是高性能的web服务器也是非常好用反向代理服务器,可以实现负载均衡,动静分离等策略,在linux下用的非常多。下面是下载地址http://nginx.org/en/download.html安装过程需要对Linux网络和配置yum源的知识比较熟悉下载下来并传入到服务器。第一步是进行解压tar-zxvfnginx-1.13.1

    2022年10月5日
  • spi协议详解_一文看懂财务三张表

    spi协议详解_一文看懂财务三张表文章目录SPI协议简介4线还是3线?4种工作模式多种传输速率SPI协议的基本时序SPI协议的升级版FPGA实现SPI协议SPI和IIC的对比总结SPI协议简介板卡内不同芯片间通讯最常用的三种串行协议:UART、I2C、SPI,之前写过串口协议及其FPGA实现,今天我们来介绍SPI协议,SPI是SerialPerripheralInterface的简称,是由Motorola公司推出的一种高速、全双工的总线协议。与IIC类似,SPI也是采用主从方式工作,主机通常为FPGA、MCU或DSP等可编程控制

    2022年10月15日
  • 熊猫烧香病毒分析报告

    熊猫烧香病毒分析报告1.样本概况1.1样本信息(1)病毒名称:spo0lsv.exe(2)所属家族:熊猫烧香(3)MD5值:B8F8E75C9E77743A61BBEA9CCBCFFD5D(4)SHA1值:188FC8FC580C0EA4BF8A8900A3D36471823C8923(5)CRC32:E63D45D3(6)病毒行为:复制自身到系统目录下设置文件属性为隐藏,并且让…

    2022年10月24日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号