Chinaunix首页 | 论坛 | 博客
  • 博客访问: 731646
  • 博文数量: 130
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 2198
  • 用 户 组: 普通用户
  • 注册时间: 2011-11-29 12:48
个人简介

每一个“丑得人神共愤”的泡妞高 手都有一颗坚忍的心,这证明了人类 在绝境中毫不妥协的求生精神,反正丑都丑了,索性放开手脚大干一场,这就叫“无产阶级失去的是锁链,得到的是全世界”

文章分类

全部博文(130)

文章存档

2013年(130)

我的朋友

分类: LINUX

2013-08-10 11:21:28

 函数原型: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)得到各部分子串。

测试代码:

  1. #include <stdio.h>
  2. #include <string.h>

  3. int main(void) {
  4.     char s[] = "hello, world! welcome to china!";
  5.     char delim[] = " ,!";

  6.     char *token;
  7.     for(token = strtok(s, delim); token != NULL; token = strtok(NULL, delim)) {
  8.         printf(token);
  9.         printf("+");
  10.     }
  11.     printf("\n");
  12.     return 0;
  13. }
输出结果为:hello+world+welcome+china+


对于strsep有如下例子:

  1. #include <stdio.h>
  2. #include <string.h>

  3. int main(void) {
  4.     char source[] = "hello, world! welcome to china!";
  5.     char delim[] = " ,!";

  6.     char *s = strdup(source);
  7.     char *token;
  8.     for(token = strsep(&s, delim); token != NULL; token = strsep(&s, delim)) {
  9.         printf(token);
  10.         printf("+");
  11.     }
  12.     printf("\n");
  13.     return 0;
  14. }
输出结果为:hello++world++welcome+to+china++


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

下面的说明摘自于最新的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
*/
阅读(1016) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~