比较C中用户输入的字符

时间:2010-10-12 04:18:07

标签: c char

以下代码段来自C程序。

用户输入Y或N.

char *answer = '\0';

scanf (" %c", answer);

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

我无法弄清楚为什么这个if语句没有评估为真。

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

4 个答案:

答案 0 :(得分: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 :(得分: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,所以我不喜欢做出无根据的假设。