前天晚上和 xiaofazhen 看程序, 突然间看到他的代码里有 strtok 这么一个函数, 网上查了一下, 居然是用来做字符串分割的;
原来 C 下还是有这函数的, 以前还一直抱怨 C 下没有字符串分割函数, 很不方便, 看来还是自己孤陋寡闻胃(如果是 C++ 的话, 参照 这里, 使用 copy+istringstream 来实现); 不多说, 既然看到了, 就要好好学习一下.
以下代码测试环境为: Windows7 + Visual Studio 2010
函数原型:
char *strtok( char *strToken, const char *strDelimit );
参数说明:
strToken: 包含 token 的字符串, 即待分割串
返回值:
返回指向第一段被截取出来的字符串的指针(根据 strDelimit 内的字符进行截取). 如果没有找到, 那么就返回 NULL.
调用说明:
(1). 第一次调用 strtok 时, 第一个参数是 strToken, 以后再调用时, 第一个参数必须是 NULL;
源代码分析:
从 这里 贴出的 Linux 下的 string.h 的实现可以看出:
测试代码:
原始代码摘自 msdn, 有扩改.
// 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 main( void ) { 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"); }
运行结果:
可以看到, 即使是全中文组成的字符串, 也是能正确分割的; 还要注意的一点是, 调用 strtok 后, 原字符串会被修改.
最后, 百度百科说明在新的 Linux 2.6.29 下, 不再使用 strtok 函数, 而是改为使用更快的 strsep 替代. 但是在 windows 环境下(当前版本 Visual Studio 2010), 并未提供 strsep 函数.
在 这里 可以看到 strsep 的函数实现, 所以可以自己写一个 strsep, 然后再调用即可. 在 strtok 函数定义处也可以看到以下说明"WARNING: strtok is deprecated, use strsep instead.".
==============================================================
这篇文章《C语言中strtok函数进行分割字符串!》写的也不错, 可以参考。
环境: Windows7 + Visual Studio 2010