NULL 的 Strtok 用法
Posted
技术标签:
【中文标题】NULL 的 Strtok 用法【英文标题】:Strtok usage with NULL 【发布时间】:2015-11-16 03:33:26 【问题描述】:我在http://www.cplusplus.com/reference/cstring/strtok/ 上找到了使用 strtok() 的示例,但不明白它们是如何通过 "pch = strtok (NULL, " ,.-");" 从一个令牌到另一个令牌获取的
代码如下:
/* strtok example */
#include <stdio.h>
#include <string.h>
int main ()
char str[] ="- This, a sample string.";
char * pch;
printf ("Splitting string \"%s\" into tokens:\n",str);
pch = strtok (str," ,.-");
while (pch != NULL)
printf ("%s\n",pch);
pch = strtok (NULL, " ,.-");
return 0;
这是输出:
Splitting string "- This, a sample string." into tokens:
This
a
sample
string
【问题讨论】:
阅读the manual。它非常明确地解释了这一点。如果看完后你还是不明白,请具体说明你不明白的地方。 不要在库代码中使用strtok()
。如果您需要标记化,请考虑 Unix 上的 strtok_r()
和 Windows 上的 strtok_s()
。或者使用其他技术来标记您的数据。 strcspn()
、strspn()
和 strpbrk()
等函数随处可用(它们是 C89/C90 标准的一部分),并且非常有用。
你可以看看What are the differences between strtok()
and strsep()
? 和Nested strtok()
function problem in C 和How to use strtok()
? 答案里都有相关信息。
【参考方案1】:
strtok
通过静态变量保持内部状态,以便您可以在多次调用中处理字符串。在您调用strtok(str, ...)
之后,对strtok(NULL, ...)
的后续调用将从str
获得后续令牌。换句话说,第一个调用获得第一个令牌。随后的调用通过传递NULL
重用相同的字符串,这将获得后续令牌。
如the manual 中所述,
strtok() 函数将字符串解析为标记序列。在第一次调用 strtok() 时,应在 str 中指定要解析的字符串。在应解析相同字符串的每个后续调用中,str 应为 NULL。
【讨论】:
【参考方案2】:strtok
函数将状态保存在静态变量中,这些变量在函数调用之间保留。
当你第一次调用strtok
时,第一个参数不是NULL,它知道这是你第一次尝试解析这个字符串,所以它会重新开始并记住它停止的位置。当您再次使用 NULL 作为第一个参数调用它时,它会使用静态变量从中断处继续。
因此,您不能使用strtok
交替解析两个单独的字符串,也不能在多线程应用程序中使用它。为此,strtok_r
函数更合适。 strtok_r
没有使用静态变量,而是采用第三个参数,它是一个“保存指针”,用于跟踪它的位置。
要记住的另一件事是strtok
和strtok_r
修改它们正在解析的字符串。如果您不想这样做,请创建字符串的副本或使用不同的函数集。
【讨论】:
请注意,Windows 使用strtok_s()
而不是 strtok_r()
— 但除了拼写之外,它们是等价的。以上是关于NULL 的 Strtok 用法的主要内容,如果未能解决你的问题,请参考以下文章