String Token strtok函数逻辑

String Token strtok function logic

我正在学习使用 C 标准函数进行字符串操作。当我学习这些东西时,我面临着 strtok 函数和以下代码。

#include <string.h>
#include <stdio.h>

int main()
{
   char str[80] = "This is - www.tutorialspoint.com - website";
   const char s[2] = "-";
   char *token;

   /* get the first token */
   token = strtok(str, s);

   /* walk through other tokens */
   while( token != NULL )
   {
      printf( " %s\n", token );
      token = strtok(NULL, s);
   }

   return(0);
}

我不明白为什么在while循环中,strtok要和null一起使用?为什么这里使用null?因为在 strtok 函数定义中有类似的东西(这个函数使用它自己的第二个参数将第一个参数字符串分解成一系列标记。)

因为它使用一个内部的static指针指向你正在处理的字符串,所以如果你想让它对同一个字符串进行操作,你只需要用NULL作为第一个参数并让它使用它的内部指针。如果您使用非空的第一个参数调用它,那么它将用新指针覆盖指针。

这反过来意味着 strtok() 不可重入。所以你通常只是在简单的情况下使用它,更复杂的情况下重入很重要(比如多线程程序,或者处理多个字符串)需要不同的方法。

一种方法是在 POSIX 系统上,您可以在其中使用 strtok_r(),它需要一个额外的参数才能使用,因为它是“内部”指针。

查看 this manual 了解更多信息。

strtok 使用内部(静态)状态来标记字符串。当使用 NULL 调用时,它会转到在第一次调用中传递的字符串中的下一个标记。

值得一提的是,这个属性(内部状态)使得在多线程环境中使用不安全。更安全的版本是 strtok_r,其中 return 状态作为输出参数。

您使用的第一个调用包含您要解析的元素的字符数组。 第二次调用它时,将 NULL 作为第一个参数传递给它,以告诉函数从字符串中的最后一个位置恢复。第一次调用后,您的 char 数组将收到已解析的字符串。如果你不放 NULL 你会失去你的位置,实际上是你的字符串的最后一部分。

char * c_Ptr = NULL;        //temp hold indivisual sections
char c_Ptr1[1000] = {NULL};
fgets(c_Ptr1, 1000, f_ptr); //Grabs a line from an open file
strtok(c_Ptr1, ",");        //first one starts at the beginning 
c_Ptr = strtok(NULL, ",");