2010-10-12 97 views
15

以下代码片段来自C程序。比较用户输入的字符C

用户输入Y或N.

char *answer = '\0'; 

scanf (" %c", answer); 

if (*answer == ('Y' || 'y')) 
    // do work 

我想不通为什么这个if语句不计算为true。

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

回答

22

我看到两个问题:

指针answernull指针,并且您试图在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

..或者通过调用'malloc()' – Arun 2010-10-12 04:25:48

+0

@ArunSaha:是的,或者让它指向一个本地char变量。 – codaddict 2010-10-12 04:27:19

+0

为什么需要在scanf中的%c之前放一个空格?对我来说,它不工作,如果我删除scanf中%c之前的空间。 – hunch 2015-08-11 13:50:11

9

answer不应该是一个指针,其目的显然是保持一个字符。 scanf借此字符的地址,所以它应该被称为

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

接下来,你的“或”语句的格式不正确。

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

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

+0

我改变了它,但由于某种原因,if语句的主体仍然没有评估 – 2010-10-12 04:21:45

+0

@Joe,如果你从我的答案中复制并粘贴,它可能会失败。 – 2010-10-12 04:22:50

+0

是的,我发现了错字,感谢 – 2010-10-12 04:26:55

5

因为比较不起作用。 '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 */ 
} 
5

首先,你的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,所以我不喜欢做出毫无根据的假设。