比较C中用户输入的字符

以下代码片段来自C程序。

用户输入Y或N.

char *answer = '\0'; scanf (" %c", answer); if (*answer == ('Y' || 'y')) // do work 

我无法弄清楚为什么这个if语句没有评估为true。

我用printf检查了y或n输入,它就在那里,所以我知道我正在收到用户输入。 此外,当我将if语句的条件替换为1(使其为真)时,它会正确评估。

我看到两个问题:

指针answer是一个null指针,您试图在scanf取消引用它,这会导致未定义的行为

你不需要这里的char指针。 您可以使用char变量:

 char answer; scanf(" %c",&answer); 

接下来看看读取的字符是'y'还是'Y'你应该这样做:

 if( answer == 'y' || answer == 'Y') { // user entered y or Y. } 

如果你真的需要使用char指针,你可以做类似的事情:

 char var; char *answer = &var; // make answer point to char variable var. scanf (" %c", answer); if( *answer == 'y' || *answer == 'Y') { 

answer不应该是一个指针,意图显然是持有一个字符。 scanf获取此字符的地址,因此应将其称为

 char answer; scanf(" %c", &answer); 

接下来,您的“或”语句形成不正确。

 if (answer == 'Y' || answer == 'y') 

你写的最初要求将answer'Y' || 'y'的结果进行比较 'Y' || 'y' ,我猜这不是你想要做的。

首先,你的answer变量应该是char类型,而不是char*

至于if语句:

 if (answer == ('Y' || 'y')) 

这是首先评估'Y' || 'y' 'Y' || 'y' ,在布尔逻辑(和ASCII)中为真,因为它们都是“真”(非零)。 换句话说,如果你以某种方式输入了CTRL A (再次,对于ASCII,并且真值等于1) * a ,你只会触发if语句。

可以使用更正确的:

 if ((answer == 'Y') || (answer == 'y')) 

但你真的应该使用:

 if (toupper(answer) == 'Y') 

因为这是实现相同目的的更便携方式。


* a你可能想知道我为什么要为我的陈述提出各种条件。 虽然绝大多数C实现使用ASCII和某些已知值,但它并不一定是ISO标准的强制要求。 我知道至少有一个编译器仍然使用EBCDIC,所以我不喜欢做出无根据的假设。

因为比较不起作用。 'Y' || 'y' 'Y' || 'y'是逻辑或运算符; 如果其任一参数为true,则返回1 (true)。 由于'Y''y'都是正确的,你将*answer与1进行比较。

你想要的是if(*answer == 'Y' || *answer == 'y')或者:

 switch (*answer) { case 'Y': case 'y': /* Code for Y */ break; default: /* Code for anything else */ }