2013-10-16 56 views
-2

C.遇到了一个小问题,限制自己使用简单的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")); 
    } 

现在,如果用户查询时输入“退出”到终端,并点击进入,如果将用于检测“退出”永远不会被运行。有任何想法吗?

感谢,

编辑:我commiting与git,因为我去,所以目前的版本可以在github.com/samheather/octo-os找到。这显然不是完整的代码,但它表明了问题。

+1

为什么每个人都低估我的问题?这对你们来说可能是显而易见的,但是这个东西在这个低级别上对我来说有点新,而且这个问题并不是很糟糕,在网上找到关于char数组指针的答案并不容易(相信我,我试过了 - 谷歌用相同的关键字抛出各种其他东西)。 –

+0

@TimCooper,可能我没有想到这个bug,但并不完全,因为这里也有指针问题。 –

回答

6

您无法将字符串与==比较。你需要使用strcmp。

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

C字符串实际上是字符数组。你可以将“command”看作是指向第一个字符的指针。你想比较字符串中的每个字符,而不仅仅是第一个字符的位置。

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. 
2

因为它的立场,现在,你用的地址command地址比较字符串文字"exit",这几乎不可能是相同的。

您想要比较内容与strcmp或(如果“只有OS指令”表示没有标准库函数),您自己编写的一个等价物遍历字符串并比较它们包含的字符。

+0

这是我在阅读我书中的一段话时不确定的东西 - 当我创建一个字符数组(例如,称为'myArray')时,myArray只是指向第一个字符的指针?还是让我混淆了?哪一部分是指针? –

+0

@SamHeather:是的,没有。'myArray'是一个数组,*但*在大多数情况下,数组的名称将“衰减”到数组的第一个元素的地址。例外是当你使用'sizeof(array)'或'&array'时。 –

+1

因此,当它衰减到第一个项目,并且执行myArray [2]时,它知道要将2 * sizeof(myArray [0])进一步移到内存中?这是不是意味着字符串的长度没有被存储,只要你到达\ 0那么远呢? –

1

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

在表达式

command == "exit" 

command是指向您的数组变量,而"exit"是指向驻留在只读数据空间字符串。它们永远不可能完全相同,所以比较总是错误的。

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