即使两个值相同,strcmp()如何返回-1?

时间:2013-06-16 14:47:50

标签: c

当我输入'x'时,compVal将值设为-1。我期待0,因为两个值都相同。请有人解释原因。

char ch = getchar();
int compVal = strcmp("x", &ch);

6 个答案:

答案 0 :(得分:8)

你必须给strcmp两个字符串。字符串是char的数组,最后一个值为\0

在您的示例中,您传递的第二个值只是char的地址,并且没有字符串终止符,因此函数会盲目前进,直到找到0(与\0)。

您应该使用strcmp char向量,例如char ch[2](您想要的字符有一个值,另一个用于我之前提到的\0,或者你应该使用==运算符,因为你只想比较一个字符。

答案 1 :(得分:4)

您可能不应该使用strcmp()来比较单个字符。

Char变量只能使用关系运算符进行比较,例如==,>,> = etc

我认为你比较的原因是你将字符串与单个字符进行比较。字符串在它们的末尾有一个空终止符“\ 0”,如果不存在则会添加它。因此,字符串比较正确地告诉您“x \ 0”不等于“x”。

答案 2 :(得分:3)

strcmp从输入地址读取,直到找到\0。所以你需要为strcmp提供NULL终止的字符串。不这样做会导致未定义的行为。

答案 3 :(得分:2)

这是两种不同的数据类型。

请记住,内部“x”在内存中存储为“x”和“\ 0”。您需要使内存看起来相同才能在C中以字符串形式工作。

这将有效:

char ch[2];
ch[0] = getchar();
ch[1] = 0;
int compVal = strcmp("x",ch);

在这里比较两个字符数组。不是单个char和char *的地址。

答案 4 :(得分:2)

将常量字符串"x"与char 'x'进行比较。通过给指向该char的指针,你的make strcmp认为它正在比较字符串。但是,常量字符串"x"'\0'结尾,但您用作字符串的字符不以'\0'结尾,这是字符串的要求。

x\0
x ^ <- difference found

但是,您正在做的事情可能会导致其他系统出现分段错误。对此的正确解决方法是在输入后放置一个终止空字符或者只是比较字符(在这种情况下甚至更好!)。

答案 5 :(得分:0)

您可以直接比较字符:

char ch = getchar();

if ('x'==ch)
{
    /* ... */
}