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

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

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

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

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

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

函数的返回值返回一个C字符串,该字符串是检索到的当前标记。 所以先调用 – >第一个令牌,第二个调用(指定NULL) – >第二个令牌,依此类推。

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

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

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

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

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

有关strtok()更多信息,请参阅此链接

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

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

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

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

从strtok的手册页(我使用cygwin并安装所有posix手册)

  Searching for Word Separators The following example searches for tokens separated by  characters. #include  ... 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,在上面的例子中搜索字符串第一次调用strtok on while循环,即LINE TO BE SEPARATED将令牌指向LINE,但在后续调用中它将跳转空白并指向TO基本上,当使用NULL时,它将在分隔符字符串之前返回指向位置的指针。