【发布时间】:2014-03-15 22:20:08
【问题描述】:
所以我是 C 和整个字符串操作的新手,但我似乎无法让 strtok() 工作。似乎每个人都有相同的 strtok 模板:
char* tok = strtok(source,delim);
do
{
{code}
tok=strtok(NULL,delim);
}while(tok!=NULL);
所以我 try 用分隔符作为空格键来执行此操作,似乎 strtok() 不仅在第一次运行后读取 NULL(第一次进入 while/do-while ) 不管字符串有多大,但它似乎也破坏了源,将源字符串变成了与 tok 一样的东西。
这是我的代码的 sn-p:
char* str;
scanf("%ms",&str);
char* copy = malloc(sizeof(str));
strcpy(copy,str);
char* tok = strtok(copy," ");
if(strcasecmp(tok,"insert"))
{
printf(str);
printf(copy);
printf(tok);
}
然后,这里是输入“insert a b c d e f g”的一些输出
aaabbbcccdddeeefffggg
“插入”似乎完全消失了,我认为这是 strcasecmp() 的错。另外,我想指出,我意识到 strcasecmp() 似乎将我的源字符串全小写,我不介意。 Anyhoo,输入“插入插入插入”绝对不会产生任何输出。就好像这些功能只是吞噬了“插入”这个词,无论它出现多少次。我可能*最终只使用了一些按字符读取字符串的 C 函数,但如果可能的话,我想避免这种情况。谢谢百万人,感谢您的帮助。
【问题讨论】:
-
您可以使用
char* copy = strdup(str);复制str,而不是错误地使用malloc,而忘记实际执行复制。 -
您不应使用未知字符串作为第一个参数调用
printf。第一个参数是一个格式字符串,它使用%分隔格式说明符来解释后续参数。如果您的任何未知字符串包含%,就会发生不好的事情。请改用puts(str)、fputs(str, stdout)或printf("%s", str)。 -
strtok通过用NUL终止符替换分隔符来改变它正在扫描的字符串。如果你打印copy,在上面运行strtok之后,你只会看到第一个标记,因为NUL终止符在插入后永远不会被删除。但是,每次使用NULL第一个参数对strtok的调用都将在上一次调用停止的地方(就在现在是NUL的分隔符之后),并从那里向前扫描,返回从那个位置。 -
strcmp和strcasecmp返回两个字符串之间的字典顺序差异。当字符串相等时,它返回0,它在C 中是一个假值。如果您希望if的主体在tok等于"insert"时执行,那么您应该显式检查返回0的值。即if(strcasecmp(tok, "insert") == 0). -
%sscanf格式说明符读取以空格分隔的字符串,因此您只会在缓冲区中获得"insert"。输入的其余部分仍将位于标准输入缓冲区中。