2

当我将输入作为“x”时,compVal 将值作为-1。我期待 0 因为这两个值是相同的。请有人解释原因。

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

6 回答 6

8

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

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

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

于 2013-06-16T14:49:36.783 回答
4

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

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

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

于 2013-06-16T14:53:09.500 回答
3

strcmp从输入地址读取,直到\0找到 a。因此,您需要向 strcmp 提供以 NULL 结尾的字符串。不这样做会导致未定义的行为。

于 2013-06-16T14:50:59.653 回答
2

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

x\0
x ^ <- difference found

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

于 2013-06-16T14:54:03.690 回答
2

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

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

这将起作用:

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

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

于 2013-06-16T14:50:15.400 回答
0

您可以直接比较字符:

char ch = getchar();

if ('x'==ch)
{
    /* ... */
}
于 2013-06-16T15:34:55.113 回答