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