【问题标题】:Strtok usage with NULLNULL 的 Strtok 用法
【发布时间】: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

【问题讨论】:

标签: c++ c string


【解决方案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() — 但除了拼写之外,它们是等价的。
    猜你喜欢
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 2014-06-20
    • 2021-12-13
    • 1970-01-01
    • 2012-04-30
    • 1970-01-01
    相关资源
    最近更新 更多