我找到了解释 strtok
函数的示例程序:
#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;
}
但是,我看不出这是如何工作的。
pch = strtok (NULL, ",.-");
怎么可能返回一个新标记。我的意思是,我们正在用 NULL
调用 strtok
。这对我来说意义不大。
关于 strtok
的两件事。如前所述,它“保持内部状态”。此外,它会弄乱您输入的字符串。本质上,它会在找到您提供的标记的地方写入一个 '\0'
,并返回一个指向字符串开头的指针。它在内部维护最后一个 token 的位置;下次调用它时,它会从那里开始。
重要的推论是你不能在 const char* "hello world";
类型的字符串上使用 strtok
,因为当你修改时你会遇到访问冲突const char*
字符串的内容。
strtok
的“好”之处在于它实际上并不复制字符串 - 因此您不需要管理额外的内存分配等。但是除非您理解以上内容,否则您将拥有无法正确使用它。
示例 - 如果您有“this,is,a,string”,连续调用 strtok
将生成如下指针(^
是返回值)。请注意,'\0'
添加在找到标记的位置;这意味着源字符串被修改:
t h i s , i s , a , s t r i n g \0 this,is,a,string
t h i s \0 i s , a , s t r i n g \0 this
^
t h i s \0 i s \0 a , s t r i n g \0 is
^
t h i s \0 i s \0 a \0 s t r i n g \0 a
^
t h i s \0 i s \0 a \0 s t r i n g \0 string
^
希望它有意义。