strtok strsep


char *  strtok ( char * 
string, const char * delimiters );

Sequentially truncate string if delimiter is found.
  If string is not NULL, the function scans string for the first occurrence of any character included in delimiters. If it is found, the function overwrites the delimiter in string by a null-character and returns a pointer to the token, i.e. the part of the scanned string previous to the delimiter.
  After a first call to strtok, the function may be called with NULL as string parameter, and it will follow by where the last call to strtok found a delimiter.
  delimiters may vary from a call to another.

Parameters.

string
Null-terminated string to scan.
separator
Null-terminated string containing the separators.

Return Value.
  A pointer to the last token found in string.   NULL is returned when there are no more tokens to be found.

Portability.
  Defined in ANSI-C.

Example.

/* strtok example */
#include <stdio.h>
#include <string.h>

int main ()
{
  char str[] ="This is a sample string,just testing.";
  char * pch;
  printf ("Splitting string \"%s\" in tokens:\n",str);
  pch = strtok (str," ");
  while (pch != NULL)
  {
    printf ("%s\n",pch);
    pch = strtok (NULL, " ,.");
  }
  return 0;
}

Output:
Splitting string "This is a sample string,just testing." in tokens:
This
is
a
sample
string
just
testing 


===================================================================================

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

测试代码:

[cpp]  view plain copy
  1. #include <stdio.h>  
  2. #include <string.h>  
  3.   
  4. int main(void) {  
  5.     char s[] = "hello, world! welcome to china!";  
  6.     char delim[] = " ,!";  
  7.   
  8.     char *token;  
  9.     for(token = strtok(s, delim); token != NULL; token = strtok(NULL, delim)) {  
  10.         printf(token);  
  11.         printf("+");  
  12.     }  
  13.     printf("\n");  
  14.     return 0;  
  15. }  

        输出结果为:hello+world+welcome+china+


        对于strsep有如下例子:

[cpp]  view plain copy
  1. #include <stdio.h>  
  2. #include <string.h>  
  3.   
  4. int main(void) {  
  5.     char source[] = "hello, world! welcome to china!";  
  6.     char delim[] = " ,!";  
  7.   
  8.     char *s = strdup(source);  
  9.     char *token;  
  10.     for(token = strsep(&s, delim); token != NULL; token = strsep(&s, delim)) {  
  11.         printf(token);  
  12.         printf("+");  
  13.     }  
  14.     printf("\n");  
  15.     return 0;  
  16. }  
        输出结果为: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 <asm-xx/string.h>  

* These are buggy as well..  

* * Fri Jun 25 1999, Ingo Oeser <ioe@informatik.tu-chemnitz.de>  

* - 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 <jason@topic.com.au>,  

* Matthew Hawkins <matt@mh.dropbear.id.au>  

* - Kissed strtok() goodbye

*/


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值