下面的代码片段来自一个C程序。
用户输入Y或N。
char *answer = '\0';
scanf (" %c", answer);
if (*answer == ('Y' || 'y'))
// do work
我不明白为什么这个if
语句的判断结果为假。
我使用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 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'
是一个逻辑或运算符;如果它的任意一个参数为真,则返回1
(真)。由于'Y'
和'y'
都为真,所以你正在将*answer
与1进行比较。
你想要的是 if(*answer == 'Y' || *answer == 'y')
或者可能是:
switch (*answer) {
case 'Y':
case 'y':
/* Code for Y */
break;
default:
/* Code for anything else */
}
answer
变量应该是char
类型,而不是char*
。if
语句:if (answer == ('Y' || 'y'))
这里首先评估了'Y' || 'y'
,在布尔逻辑中(对于ASCII),由于它们都是“true”(非零),所以结果为真。换句话说,只有在某种方式下输入了CTRLA(对于ASCII,在那里真值等于1)*a,您才会让if
语句执行。
您也可以使用更正确的写法:
if ((answer == 'Y') || (answer == 'y'))
但是你真的应该使用:
if (toupper(answer) == 'Y')
因为这是实现同样目的最便携的方式,所以我建议使用它。
*a 你可能会想为什么我的陈述中要加入各种条件。虽然绝大多数的C语言实现都使用ASCII和特定的已知值,但这并不一定是ISO标准规定的。我知道至少有一种编译器仍在使用EBCDIC,所以我不喜欢做出没有根据的假设。