C中的strtok函数如何工作?

use*_*316 20 c strtok

我找到了这个解释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, " ,.-");返回一个新令牌呢?我的意思是,我们要求strtokNULL.这对我来说没有多大意义.

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)

希望它有意义.


Sea*_*ean 4

strtok维持内部状态。当您使用非 NULL 调用它时,它会重新初始化自身以使用您提供的字符串。当您使用它调用它时NULL,它使用该字符串,以及它当前必须返回下一个标记的任何其他状态。

由于这种strtok工作方式,如果您正在编写多线程应用程序,则需要确保链接到 C 运行时的多线程版本。这将确保每个线程获得其自己的内部状态strtok