【发布时间】:2013-04-12 11:04:38
【问题描述】:
只是 strtok 和 strcmp 有点问题。
我正在尝试将用户通过 fgets 输入的内容与某个预定字符串进行比较:
char *token[100];
fgets(s, sizeof(s), stdin)
token[0] = strtok(s, " "); // Get first word
printf("tok: %s", token[0]);
printf("cmp: %d\n", strcmp(token[0], "/bin/echo");
显然不是所有的代码,但这表明了我的问题 - 如果我输入“/bin/echo ...”(或任何相关内容),它将被放入 token[0],并被打印出来。它打印正确,但是当它打印 cmp 值时,它永远不会为 0。对于 /bin/echo,由于某种原因, cmp 值是 1。
谢谢。
编辑以消除关于 s 和令牌的混淆:
char s[1024];
char *token[100];
EDIT 2 - 添加了一些其他测试用例: 我在标准输入中输入了“/bin/echo hello world”
token[0] = strtok(s, " \n\0"); // Get first word
printf("token[0] is: %s", token[0]);
printf("cmp: %d\n", strcmp(token[0], "/bin/echo"));
输出:
token[0] is: /bin/echo
cmp: 1
然后我尝试对标记字符串进行硬编码:
char str[] = "/bin/echo hello world";
token[0] = strtok(str, " ");
printf("token[0] is: %s", token[0]);
printf("cmp: %d\n", strcmp(token[0], "/bin/echo"));
输出:
token[0] is: /bin/echo
cmp: 0
【问题讨论】:
-
我们可以从可编译的代码开始。 (
fgets()之后缺少半,s没有声明,第二个printf()缺少结束括号,只是随便命名我看到的那些)。但是,真正缺少的部分是s。最好是某种有效的内存缓冲区。 -
也就是说,我修复并运行了这段代码,将
s声明为本地缓冲区char s[100];并运行代码,输入为“/bin/echo madness”。它运行良好并将0报告为比较结果,所以无论您的问题是什么,这段代码都没有显示它(无论如何,除了编译错误之外)。 -
我怀疑你输入 only
"/bin/echo"。然后你会得到令牌"/bin/echo\n",因为fgets包含换行符。 -
Look at the sample I linked again。这些不是硬编码的。它从标准输入中提取。
-
你意识到他们在哪里不同的悬念,而不是他们在哪里相似会在剩下的时间里吃掉我,对吧?不管那个区别是什么,这就是为什么你的不工作,所以也许分享一下。
标签: c token delimiter strtok strcmp