以下代码片段来自C程序。比较用户输入的字符C
用户输入Y或N.
char *answer = '\0';
scanf (" %c", answer);
if (*answer == ('Y' || 'y'))
// do work
我想不通为什么这个if
语句不计算为true。
我检查了y或n输入与printf
,它在那里,所以我知道我得到的用户输入。另外,当我用1代替if语句的条件(使其为真)时,它会正确评估。
以下代码片段来自C程序。比较用户输入的字符C
用户输入Y或N.
char *answer = '\0';
scanf (" %c", answer);
if (*answer == ('Y' || 'y'))
// do work
我想不通为什么这个if
语句不计算为true。
我检查了y或n输入与printf
,它在那里,所以我知道我得到的用户输入。另外,当我用1代替if语句的条件(使其为真)时,它会正确评估。
我看到两个问题:
指针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')
你写的最初要求与'Y' || 'y'
,这是我猜的结果比较answer
是不是你想要做的相当的。
我改变了它,但由于某种原因,if语句的主体仍然没有评估 – 2010-10-12 04:21:45
@Joe,如果你从我的答案中复制并粘贴,它可能会失败。 – 2010-10-12 04:22:50
是的,我发现了错字,感谢 – 2010-10-12 04:26:55
因为比较不起作用。 'Y' || 'y'
是一个逻辑或运算符;它返回1
(true),如果其任一参数为true。由于'Y'
和'y'
都是真的,你与1
比较*answer
你想要的是if(*answer == 'Y' || *answer == 'y')
或者是:
switch (*answer) {
case 'Y':
case 'y':
/* Code for Y */
break;
default:
/* Code for anything else */
}
首先,你的answer
VA riable应该是char
,而不是char*
。
至于if
语句:
if (answer == ('Y' || 'y'))
这是第一评估'Y' || 'y'
,其在布尔逻辑(以及ASCII)为真,因为两者都是“真”(非零)。换句话说,如果您以某种方式输入CTRLA(同样,对于ASCII码,并且其中的真值等于1),您只会获得if
声明* a。
您可以使用更正确的:
if ((answer == 'Y') || (answer == 'y'))
,但你真的应该使用:
if (toupper(answer) == 'Y')
因为这是实现同一目的的更便携的方式。
*一个你可能会奇怪,为什么我在各种条件句我把我的发言。尽管绝大多数C实现使用ASCII和某些已知值,但它不一定是由ISO标准规定的。我知道至少有一个编译器仍然使用EBCDIC,所以我不喜欢做出毫无根据的假设。
..或者通过调用'malloc()' – Arun 2010-10-12 04:25:48
@ArunSaha:是的,或者让它指向一个本地char变量。 – codaddict 2010-10-12 04:27:19
为什么需要在scanf中的%c之前放一个空格?对我来说,它不工作,如果我删除scanf中%c之前的空间。 – hunch 2015-08-11 13:50:11