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

29

为什么在strok()函数中要使用NULL

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

*h指向一个字符串时,这个程序会做什么?


7
你有没有研究或阅读过strtok函数的实际作用? - Joe
是的,我知道它使用分隔符解析字符串。但是h!= NULL是什么意思? - user3600999
2
如果没有剩余的标记可供检索,则返回空指针。 - Joachim Isaksson
1
谢谢,伙计。但是我们为什么要在这里使用它呢? ----> h = strtok(NULL, delim); - user3600999
5
应该在你手边的C参考手册中进行解释。它告诉strtok从上一个标记的结尾继续扫描。 - John Bode
6个回答

40

strtok 是 C 库中的一部分,它的作用是将一个以 null 结尾的 C 字符串按照指定的分隔符拆分成多个 token。

第一次调用 strtok 必须传入要拆分的 C 字符串,后续的调用必须将第一个参数指定为 NULL,这告诉函数继续拆分你传入的字符串。

该函数的返回值是当前获取到的 token 的 C 字符串。因此第一次调用-->第一个 token,第二次调用(指定为 NULL)-->第二个 token,以此类推。

当没有剩余的 token 可以获取时,strtok 返回 NULL,表示该字符串已完全拆分成多个 token。

以下是参考链接和示例:http://www.cplusplus.com/reference/cstring/strtok/


19

strtok()函数会将指针保存在静态变量中,以记录上次处理字符串时的位置,在第二次调用时,当我们传递空指针时,strtok()从静态变量中获取指针。

如果您再次提供相同的字符串名称,则它将重新从开始处开始。

此外,strtok()是破坏性的,即它会更改原始字符串。因此,请确保始终有原始字符串的副本。

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


4

来自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 循环中的第一次对 LINE TO BE SEPARATED 调用strtok 会使令牌指向 "LINE" ,但在后续调用中,它将跳过空格,并将指针指向 "TO",基本上当使用NULL时,令牌将返回分隔符字符串前的位置的指针。

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

str - 需要截断的C字符串。注意,该字符串通过被分成更小的字符串(标记)而被修改。 另外,可以指定空指针,在这种情况下,函数将继续扫描先前成功调用函数的地方。

delimiters - 包含分隔符字符的C字符串。这些字符可能会因为每次调用函数而有所不同。

关于strtok()的更多信息,请参见此链接


2

调用 char * strtok ( char * str, const char * delimiters ) 函数可以将字符串分割成多个标记。

第一次调用 strtok() 函数时,需要将字符串和分隔符作为输入,并返回字符串的第一个标记。

要找到字符串的其余标记,需要进行后续调用,并通过将NULL作为输入传递给 strtok( NULL , const char *delimiters ) 来指定后续调用。

当没有发现更多标记时,它将返回 NULL。

注意:每次调用时,字符串 "delimiters" 可能不同。


2

strtok在静态指针中知道上次执行的位置。如果我们将第一个参数传递为NULL,则意味着我们将在先前的字符串中搜索,而不是将此函数用于任何其他字符串。例如,您有char * str =“1,2,3,4,5”,并且调用了strtok(str,“,”)。它将给您第一个“,”的地址。当您为第一个参数传递NULL(strtok(NULL,“,”))时,而不是从1开始搜索,您将从2开始搜索。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接