String Token strtok函数逻辑

时间:2015-12-12 13:51:42

标签: c string strtok

我正在学习使用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函数定义中有类似的东西(这个函数使用第二个参数将第一个参数字符串分解为一系列标记。)

3 个答案:

答案 0 :(得分:7)

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

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

一种方法是在POSIX系统上,你可以使用strtok_r()一个额外的参数来使用,因为它是&#34; 内部&#34;指针。

检查this manual以了解更多信息。

答案 1 :(得分:4)

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

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

答案 2 :(得分:2)

第一个调用你使用一个char数组,它包含你想要解析的元素。 第二次调用它时,你传递它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, ",");