-2

C有一个小问题。将自己限制在简单的C(即操作系统指令)上,两个字符串似乎不一样。这是我的代码:

    char inputData[256];
    int rid;
    rid = read(0,inputData,256);
    // Strip input
    char command[rid];
    int i;
    for (i = 0; i<=rid-2; i++) {
        command[i] = inputData[i];
    }
    command[rid-1] = '\0';
    if (command == "exit") {
        write(1,"exit",sizeof("exit"));
    }

现在,如果用户在查询时在终端中输入“exit”并按回车,则用于检测“exit”的 if 永远不会运行。有任何想法吗?

谢谢,

编辑:我正在承诺使用 git,因此可以在 github.com/samheather/octo-os 找到当前版本。这显然不是完整的代码,但它说明了问题。

4

5 回答 5

6

你不能用 == 比较字符串。您需要使用 strcmp。

if (strcmp(command, "exit") == 0) {

C 字符串实际上是字符数组。您可以将“命令”视为指向第一个字符的指针。您想比较字符串中的每个字符,而不仅仅是第一个字符的位置。

于 2013-10-16T15:56:49.163 回答
2

您应该使用strcmp比较 C 中的字符串。

if(strcmp(command, "exit") == 0) //strcmp returns 0 if strings are equal

去引用:

A zero value indicates that both strings are equal. A value greater than zero indicates
that the first character that does not match has a greater value in str1 than in str2.
a value less than zero indicates the opposite.
于 2013-10-16T15:57:17.650 回答
2

就目前而言,您正在将 的地址command与字符串字面量的地址进行比较"exit",这几乎不可能相同。

您想比较内容,strcmp或者(如果“仅操作系统指令”意味着没有标准库函数)您自己编写的等效项,它遍历字符串并比较它们包含的字符。

于 2013-10-16T15:58:22.373 回答
1

strcmp从标准库中使用。

于 2013-10-16T15:57:02.133 回答
1

正如其他人所说,==不适用于字符串。原因是它会比较给定的指针。

在表达式中

command == "exit"

command是指向数组变量"exit"的指针,而是指向位于只读数据空间中的字符串的指针。它们永远不可能相同,因此比较总是错误的。

这就是为什么strcmp()要走的路。

于 2013-10-16T15:59:44.647 回答