比较C中用户输入的字符

Joe*_*cho 15 c char

以下代码片段来自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)


Mar*_*iot 9

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',我猜你的结果并不是你想做的.


hob*_*bbs 5

因为比较不起作用.'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)


pax*_*blo 5

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