以下代码段来自C程序。
用户输入Y或N.
char *answer = '\0';
scanf (" %c", answer);
if (*answer == ('Y' || 'y'))
// do work
我无法弄清楚为什么这个if
语句没有评估为真。
我用printf
检查了y或n输入,它就在那里,所以我知道我正在收到用户输入。此外,当我将if语句的条件替换为1(使其为真)时,它会正确评估。
答案 0 :(得分:22)
我看到两个问题:
指针answer
是null
指针,您试图在scanf
中取消引用它,这会导致未定义的行为。
这里不需要char
指针。您只需使用char
变量:
char answer;
scanf(" %c",&answer);
接下来查看您应该执行的阅读字符是'y'
还是'Y'
:
if( answer == 'y' || answer == 'Y') {
// user entered y or Y.
}
如果确实需要使用字符指针,您可以执行以下操作:
char var;
char *answer = &var; // make answer point to char variable var.
scanf (" %c", answer);
if( *answer == 'y' || *answer == 'Y') {
答案 1 :(得分:9)
answer
不应该是指针,意图显然是持有一个角色。 scanf
获取此字符的地址,因此应将其称为
char answer;
scanf(" %c", &answer);
接下来,您的“或”语句形成错误。
if (answer == 'Y' || answer == 'y')
您所写的内容最初要求将answer
与'Y' || 'y'
的结果进行比较,我猜这并不是您想要做的。
答案 2 :(得分:5)
因为比较不起作用。 '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 */
}
答案 3 :(得分:5)
首先,您的answer
变量应为char
类型,而不是char*
。
至于if
声明:
if (answer == ('Y' || 'y'))
这首先评估'Y' || 'y'
,它在布尔逻辑(和ASCII)中为真,因为它们都是“真”(非零)。换句话说,如果您以某种方式输入 CTRL A (再次,对于ASCII,并且其中为true),则只会触发if
语句值等于1) * a 。
你可以使用更正确的:
if ((answer == 'Y') || (answer == 'y'))
但你真的应该使用:
if (toupper(answer) == 'Y')
因为这是实现相同目标的更便携方式。
* a 你可能想知道我为什么要为我的陈述提出各种条件。虽然绝大多数C实现使用ASCII和某些已知值,但它并不一定是ISO标准的强制要求。我知道至少有一个编译器仍然使用EBCDIC,所以我不喜欢做出无根据的假设。