为什么我们在strtok()中使用NULL?

时间:2014-05-04 12:45:51

标签: c null strtok

为什么我们在strok()函数中使用null?

while(h!=NULL)
{
   h=strtok(NULL,delim);  
   if(hold!=NULL) 
      printf("%s",hold);    
}

当* h指向字符串时,该程序会执行什么操作?

5 个答案:

答案 0 :(得分:6)

strtok是C库的一部分,它的作用是将C null分隔的字符串拆分为由您指定的任何分隔符分隔的标记。

第一次调用strtok必须将C字符串传递给tokenize,后续调用必须指定NULL作为第一个参数,它告诉函数继续对您首先传递的字符串进行标记。

函数的返回值返回一个C字符串,该字符串是检索到的当前标记。所以先打电话 - >第一个令牌,第二个呼叫(指定NULL) - >第二个令牌,等等。

如果没有要检索的令牌,strtok将返回NULL ,这意味着该字符串已完全标记化。

以下是参考资料,例如:http://www.cplusplus.com/reference/cstring/strtok/

答案 1 :(得分:2)

char * strtok ( char * str, const char * delimiters );

str - 要截断的C字符串。  请注意,此字符串通过分解为较小的字符串(标记)进行修改。  或者,可以指定空指针,在这种情况下,函数会继续扫描先前成功调用函数的位置。

分隔符 - 包含分隔符字符的C字符串。  这些可能因呼叫而异。

有关strtok()的详情,请参阅此link

答案 2 :(得分:1)

在strtok的手册页中(我使用cygwin,并且已安装所有posix手册)

 Searching for Word Separators
       The following example searches for tokens separated by <space> characters.

           #include <string.h>
           ...
           char *token;
           char line[] = "LINE TO BE SEPARATED";
           char *search = " ";

           /* Token will point to "LINE". */
           token = strtok(line, search);

           /* Token will point to "TO". */
           token = strtok(NULL, search);

基本上,后续调用中的strtok期望为​​NULL,在上例中,搜索字符串在while循环中第一次对strtok的调用是LINE TO BE SEPARATED,它将使令牌指向LINE,但是在后续调用中,它将跳过空白并基本上指向TO,当使用NULL时,令牌将返回一个指向定界符字符串之前位置的指针。

答案 3 :(得分:0)

strtok()将指针存储在静态变量中,您最后一次停在哪里,所以在第二次调用时,当我们传递null时, strtok ()从静态变量中获取指针。

如果您提供相同的字符串名称,它将从头开始。

此外,strtok()具有破坏性,即它会改变原始字符串。 所以请确保你总是有一份orignal副本。

使用strtok()的另一个问题是,因为它将地址存储在静态变量中,所以在多线程编程中多次调用strtok()会导致错误。 对于此用途 strtok_r()

答案 4 :(得分:0)

char * strtok(char * str,const char *定界符)的调用序列将字符串拆分为标记。 对strtok()的首次调用将字符串和定界符作为输入,并返回字符串的 first 令牌。

要查找字符串后续调用的其余标记,并通过将 NULL 作为输入传递给strtok( NULL >,const char * delimiters)。

在找不到其他令牌时返回NULL。

注意:每个调用中的字符串“定界符”可能不同。