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