当我将输入作为“x”时,compVal 将值作为-1。我期待 0 因为这两个值是相同的。请有人解释原因。
char ch = getchar();
int compVal = strcmp("x", &ch);
当我将输入作为“x”时,compVal 将值作为-1。我期待 0 因为这两个值是相同的。请有人解释原因。
char ch = getchar();
int compVal = strcmp("x", &ch);
你必须给 strcmp 两个字符串。char
字符串是最后一个值为的数组\0
。
在您的示例中,您传递的第二个值只是 a 的地址,char
并且没有字符串终止符,因此该函数盲目地前进,直到找到 a 0
(与 相同的东西\0
)。
您应该使用strcmp
一个char
向量,例如char ch[2]
( 一个值用于您想要的字符,另一个用于\0
我前面提到的,或者在您的情况下,您应该只使用==
运算符,因为您只想比较一个字符。
您可能不应该使用 strcmp() 来比较单个字符。
字符变量只能使用关系运算符进行比较,例如 ==、>、>= 等
我认为您比较不起作用的原因是您将字符串与单个字符进行比较。字符串的末尾有一个空终止符“\0”,如果不存在,它将被添加。因此,字符串比较正确地告诉您“x\0”不等于“x”。
strcmp
从输入地址读取,直到\0
找到 a。因此,您需要向 strcmp 提供以 NULL 结尾的字符串。不这样做会导致未定义的行为。
您将常量字符串"x"
与 char进行比较'x'
。通过提供指向该字符的指针,您的 strcmp 认为它正在比较字符串。但是,常量字符串"x"
以结尾'\0'
但您用作字符串的字符不以 结尾'\0'
,这是字符串的要求。
x\0
x ^ <- difference found
但是,您正在执行的操作可能会导致其他系统出现分段错误。正确的解决方法是在输入之后放置一个终止空字符,或者只是比较字符(在这种情况下更好!)。
这是两种不同的数据类型。
请记住,内部“x”在内存中存储为“x”和“\0”。您需要使内存看起来相同,才能在 C 中作为字符串工作。
这将起作用:
char ch[2];
ch[0] = getchar();
ch[1] = 0;
int compVal = strcmp("x",ch);
在这里,您比较两个字符数组。不是单个 char 和 char* 的地址。
您可以直接比较字符:
char ch = getchar();
if ('x'==ch)
{
/* ... */
}