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 没有使用静态变量,而是采用第三个参数,它是一个“保存指针”,用于跟踪它的位置。

要记住的另一件事是strtokstrtok_r 修改它们正在解析的字符串。如果您不想这样做,请创建字符串的副本或使用不同的函数集。

【讨论】:

请注意,Windows 使用 strtok_s() 而不是 strtok_r() — 但除了拼写之外,它们是等价的。

以上是关于NULL 的 Strtok 用法的主要内容,如果未能解决你的问题,请参考以下文章

strtok函数怎么用啊?

字符串上 strtok() 的 C++ 用法

strtok/atoi/atof/atol函数用法 详解

ASP中FormatDateTime函数用法详解

sstrtok函数用法

sstrtok函数用法