c - C 中的 strtok 函数如何工作?

标签 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;
}

但是,我看不出这是如何工作的。

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
                              ^

希望它有意义。

关于c - C 中的 strtok 函数如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21097253/

相关文章:

c - C 代码中没有重复

c - 在 C 中使用#define 进行字符串连接

c - 这学期刚开始学C,但我似乎无法理解教授在这道题中想从我们这里得到什么

c - strtok_r 导致 "assignment makes pointer from integer without a cast"

c++ - 用strtok拼接cstrings,只适用于循环的第一次执行

c - 在 C 中处理具有长度的字符串

c++ - typedef 用于可以包含 size_t 的有符号类型?

c - strtok:如何将 token 存储在两个不同的缓冲区中

c - Strtok 及其输入

C - Strtok() ,将字符串拆分为 '\n' 但保留分隔符