带有NULL的Strtok用法

Strtok usage with NULL

本文关键字:用法 Strtok NULL 带有      更新时间:2023-10-16

我在http://www.cplusplus.com/reference/cstring/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 ("%sn",pch);
    pch = strtok (NULL, " ,.-");
  }
  return 0;
}

这是输出:

Splitting string "- This, a sample string." into tokens:
This
a
sample
string

strtok通过静态变量保持内部状态,这样您就可以在多个调用中处理一个字符串。调用strtok(str, ...)后,对strtok(NULL, ...)的后续调用将从str获得后续令牌。换句话说,第一个调用获得第一个令牌。随后的调用通过传递NULL来重用相同的字符串,从而获得后续的令牌。

如手册所述,

strtok()函数将字符串解析为一系列标记。在第一次调用strtok()时,应在str中指定要解析的字符串。在每个应该解析同一字符串的后续调用中,str应该为NULL。

strtok函数在静态变量中保持状态,静态变量在函数调用之间保留。

第一次用第一个参数非NULL调用strtok时,它知道这是第一次尝试解析这个字符串,所以它会重新开始并记住它在哪里停止。当你用NULL作为第一个参数再次调用它时,它会使用静态变量来恢复它停止的地方

因此,您不能使用strtok来交换解析两个单独的字符串,也不能在多线程应用程序中使用它。为此,strtok_r函数更为合适。strtok_r不使用静态变量,而是使用第三个参数,即"保存指针",用于跟踪它的位置。

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