c语言字符串str,c语言中strtok函数

  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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • c语言调用退出函数 c语言退出整个程序怎么写
  • c语言中怎么给函数初始化 c语言的初始化语句
  • c语言编写函数计算平均值 c语言求平均函数
  • 详解c语言中的字符串数组是什么,详解c语言中的字符串数组结构,详解C语言中的字符串数组
  • 表达式求值c++实现,c语言实现表达式求值
  • 看懂c语言基本语法,C语言详解,C语言的基本语法详解
  • 用c语言实现快速排序算法,排序算法设计与实现快速排序C语言,C语言实现快速排序算法实例
  • 深入解析c语言中函数指针的定义与使用方法,深入解析c语言中函数指针的定义与使用情况,深入解析C语言中函数指针的定义与使用
  • 描述E-R图,E-R图举例,关于C语言中E-R图的详解
  • 折半查找法C语言,折半查找算法(算法设计题)
  • 折半查找法C语言,c语言折半法查找数据,C语言实现折半查找法(二分法)
  • 扫雷小游戏c++代码设计,c语言扫雷游戏源代码,C语言实现扫雷小游戏详细代码
  • 怎样统计程序代码行数,C语言统计行数,C#程序员统计自己的代码行数
  • 基于c语言的贪吃蛇游戏程序设计,用c语言编写贪吃蛇游戏程序,C语言实现简单的贪吃蛇游戏
  • 图的两种遍历算法,图的遍历算法代码c语言,Python算法之图的遍历
  • 留言与评论(共有 条评论)
       
    验证码: