我找到了这个解释strtok
函数的示例程序:
#include <stdio.h>
#include <string.h>
int main ()
{
char str[] ="- This, a sample string.";
char * pch;
printf ("Splitting string \"%s\" into tokens:\n",str);
pch = strtok (str," ,.-");
while (pch != NULL)
{
printf ("%s\n",pch);
pch = strtok (NULL, " ,.-");
}
return 0;
}
然而,我不认为这是可行的。
pch = strtok (NULL, " ,.-");
怎么可能返回一个新的令牌。我是说我们要和NULL
一起给strtok
打电话。这对我来说没有多大意义。
发布于 2014-01-14 01:13:18
strtok
维护内部状态。当您使用非NULL调用它时,它会重新初始化自身以使用您提供的字符串。当您使用NULL
调用它时,它使用该字符串,并且它当前获得的任何其他状态都将返回下一个令牌。
由于strtok
的工作方式,如果您正在编写多线程应用程序,则需要确保链接到多线程版本的C运行时。这将确保每个线程为strtok
获取自己的内部状态。
发布于 2014-01-14 01:16:12
strtok
函数将数据存储在一个内部静态变量中,该变量在所有线程之间共享。
为了线程安全,您应该使用strtok_r
来自http://www.opensource.apple.com/source/Libc/Libc-167/string.subproj/strtok.c
看一看static char *last;
char *
strtok(s, delim)
register char *s;
register const char *delim;
{
register char *spanp;
register int c, sc;
char *tok;
static char *last;
if (s == NULL && (s = last) == NULL)
return (NULL);
/*
* Skip (span) leading delimiters (s += strspn(s, delim), sort of).
*/
cont:
c = *s++;
for (spanp = (char *)delim; (sc = *spanp++) != 0;) {
if (c == sc)
goto cont;
}
if (c == 0) { /* no non-delimiter characters */
last = NULL;
return (NULL);
}
tok = s - 1;
/*
* Scan token (scan for delimiters: s += strcspn(s, delim), sort of).
* Note that delim must have one NUL; we stop if we see that, too.
*/
for (;;) {
c = *s++;
spanp = (char *)delim;
do {
if ((sc = *spanp++) == c) {
if (c == 0)
s = NULL;
else
s[-1] = 0;
last = s;
return (tok);
}
} while (sc != 0);
}
/* NOTREACHED */
}
https://stackoverflow.com/questions/21097253
复制相似问题