【问题标题】:strtok return string?strtok 返回字符串?
【发布时间】: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


【解决方案1】:

这里我做了小程序

#include<string.h>
#include<stdio.h>

int main()
{
char str[] ="/bin/echo this is something";
  char * token[100];
  token[0] = strtok (str," ");

token[0] = strtok(str, " "); // Get first word
printf("cmp: %d\n", strcmp(token[0], "/bin/echo"));
return 0;
}

这里我有静态存储的输入字符串而不是 fgets()

效果很好。

http://codepad.org/IrGAXT8f

【讨论】:

  • 刚刚尝试过,它可以工作 - 唯一的问题是我需要从命令行标准输入获取输入,所以硬编码 str[] 不幸的是:(
【解决方案2】:

使用

char token[1000];
strcpy(token,strtok(s," "));

字符串不能像这样在 c 中直接赋值 :)

另外,包括 string.h

【讨论】:

  • 这不仅是错误的,而且是其最大的错误。阅读strtok()s 文档,然后查看令牌指针数组类型
  • 无法将字符串复制到未初始化的内存中。你需要先分配内存。
  • @user206334 如果您了解strtok() 及其返回的内容,则无需复制字符串根本
  • @WhozCraig strtok 与缓冲区混淆,在分隔符位置添加 '\0' 作为未来标记。这就是为什么它不是 const char * 并且您不能将 strtok 与静态内存对象(如文字字符串)一起使用。
  • @user206334 这有点像strtok() 的功能。这不是 OP 遇到的问题,据我所知,与此答案或其不正确性无关。
【解决方案3】:

需要动态分配内存来复制字符串。首先了解动态内存管理(malloc、calloc 等)

编辑: http://ideone.com/0UxEwO - 为我工作

#include <stdio.h>
#include <string.h>

int main()
{
    char s[1024];
    char *token[100];
    fgets(s, sizeof(s), stdin);
    token[0] = strtok(s, " \n\0");
    printf("token[0] is: %s", token[0]);
    printf("cmp: %d\n", strcmp(token[0], "/bin/echo"));
}

【讨论】:

  • 投反对票的请解释一下 s 是如何分配的?需要静态指定数组大小或动态分配内存。不能简单地使用 char * s = fgets(...)。
  • 我没有对此投反对票,但是您在哪里看到使用 char *s = fgets(...) 的 OP?缺少任何s 是代码存在的诸多问题之一,但没有说它必须 是动态分配的。它也可以是一个堆栈变量。
  • 抱歉,可能应该显示 s 和 token 正在初始化。添加到 OP。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多