为什么我们在strok()
函数中使用null?
while(h!=NULL)
{
h=strtok(NULL,delim);
if(hold!=NULL)
printf("%s",hold);
}
当* h指向字符串时,该程序会执行什么操作?
答案 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。
注意:每个调用中的字符串“定界符”可能不同。