我找到了这个解释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;
}
Run Code Online (Sandbox Code Playgroud)
但是,我不知道这是如何工作的.
如何pch = strtok (NULL, " ,.-");
返回一个新令牌呢?我的意思是,我们要求strtok
用NULL
.这对我来说没有多大意义.
Flo*_*ris 38
有两点需要了解strtok
.如前所述,它"保持内部状态".此外,它会弄乱你喂它的字符串.从本质上讲,它会'\0'
在找到您提供的令牌的位置写入,并返回指向字符串开头的指针.在内部,它维护最后一个令牌的位置; 下次你打电话,它从那里开始.
重要的推论是您不能strtok
在一种const char* "hello world";
字符串上使用,因为在修改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
^
Run Code Online (Sandbox Code Playgroud)
希望它有意义.
strtok
维持内部状态。当您使用非 NULL 调用它时,它会重新初始化自身以使用您提供的字符串。当您使用它调用它时NULL
,它使用该字符串,以及它当前必须返回下一个标记的任何其他状态。
由于这种strtok
工作方式,如果您正在编写多线程应用程序,则需要确保链接到 C 运行时的多线程版本。这将确保每个线程获得其自己的内部状态strtok
。