c库函数之分割字符串

函数原型:
char *strtok(char *strToken,const char *strDelimit );

参数说明:
    strToken:   包含 token 的字符串, 即待分割串

strDelimit: token 的集合, strToken 会根据这里的每个字符进行分割
 返回值:
    返回指向第一段被截取出来的字符串的指针(根据 strDelimit 内的字符进行截取). 如果没有找到, 那么就返回 NULL.
 调用说明:
    (1). 第一次调用 strtok 时, 第一个参数是 strToken, 以后再调用时, 第一个参数必须是 NULL;

    (2). 调用 strtok 后, 原字符串会被修改;

    (3). strtok 不是一个线程安全的函数.
 源代码分析:
    从 这里 贴出的 Linux 下的 string.h 的实现可以看出:

    (1). strtok 使用一个全局定义的 char * ___strtok; 来指向截取后的剩余字符串, 所以从第二次开始调用 strtok 后, 第一个参数就只需要设为 NULL 就可以了;

    (2). strtok 函数会在一开始就判断其第一个参数, 若不为 NULL, 就取其第一个参数进行截取, 并将 ___strtok 指向截取后的字符串; 若为NULL, 则使用 ___strtok 进行截取, 并将 ___strtok 指向截取后的字符串;

    (3). strtok 使用 sbegin 指向待截取的字符串, 当找到 strDelimit 里的字符时, 就在这个字符前面插入 '\0', 这样就相当于从 sbegin 指向的字符串里截取出前面一段了. 而后面一段, 则由 ___strtok 指向, 等待下一次截取.
 测试代码:

 // crt_strtok.c
// compile with: /W3
// In this program, a loop uses strtok
 // to print all the tokens (separated by commas
 // or blanks) in the string named "string".
 //
#include <string.h>
#include <stdio.h>
#include <Windows.h>
char string[] = "A string\tof ,,tokens\nand some  more tokens";
char seps[]   = " ,\t\n";
char chinese[] = "中国,吃饭";
char *token;
int _tmain(int argc, _TCHAR* argv[])
{
     printf( "英文测试:\n" );
      // Establish string and get the first token:
     token = strtok( string, seps ); // C4996
     // Note: strtok is deprecated; consider using strtok_s instead
     while( token != NULL )
     {
         // While there are tokens in "string"
         printf( " %s\n", token );
          // Get next token:
         token = strtok( NULL, seps ); // C4996
     } 
 
     printf("原字符串: %s\n", string);   // 结果为 A, 说明原字符串已发生改变
 
 
     printf( "\n中文测试:\n");
 
     token = strtok( chinese, ",");
     while(token != NULL )
     {
         printf( "%s\n", token);
 
         token = strtok( NULL, ",");
     }
 
     printf("\n");
     system("pause");
 	return 0;
 }


运行结果:

可以看到, 即使是全中文组成的字符串, 也是能正确分割的; 还要注意的一点是, 调用 strtok 后, 原字符串会被修改.

在新的 Linux 2.6.29 下, 不再使用 strtok 函数, 而是改为使用更快的 strsep 替代。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值