#include <stdio.h>
int main(int argc, const char * argv[]) {
//run...
printf("----------------CALC--------------\n");
printf("(1) Type in a letter to get a secret message: ");
int validSecret = 0;
char secretLetter;
while(validSecret == 0){
scanf("%c",&secretLetter);
if(secretLetter == 'b'){
printf("B\n");
}
else if (secretLetter == 'r'){
printf("R\n");
}
else if (secretLetter == 'k'){
printf("K\n");
}
else {
printf("Game over\n");
validSecret = 1;
}
}
return 0;
}
如果我输入a
b
if语句正确执行并打印B和新行,但也打印游戏结束。它正在运行if和else ......这没有任何意义。
答案 0 :(得分:1)
您输入的换行符(对应于'\n'
个字符)与任何其他条件都不匹配;当然,您的代码会因此而占用else
分支。
stdin
是否有可能达到EOF
?您的代码忽略了返回值,因此无法检测到这种情况......它应该看起来更像:
while (scanf("%c", &secretLetter) == 1) {
if (secretLetter == 'b') {
printf("B\n");
}
else if (secretLetter == 'r'){
printf("R\n");
}
else if (secretLetter == 'k'){
printf("K\n");
}
else if (secretLetter != '\n') {
printf("Game over\n");
break;
}
}
注意我是如何将else
转换为else if (secretLetter != '\n')
的?这可以防止在secretLetter
为\n
时打印“游戏结束”,解决第一个问题......
还要注意我如何使循环的终止条件与scanf
的失败相匹配?这可以防止在stdin
到达EOF
时循环继续。您可能希望将printf("Game over\n");
移到循环外部以解决此问题。
这里不需要中间变量代替break
;你应该不惜一切代价避免不必要的混乱。
答案 1 :(得分:0)
读取输入后,需要刷新输入缓冲区,如此
void flush()
{
while (getchar() != '\n')
;
}
这样可以消耗包含换行符在内的所有字符。原因是scanf
在看到'\n'
后立即停止读取,因此将其留在inpu缓冲区中。另外,永远不要用fflush(stdin)
冲洗,因为那不便携。
答案 2 :(得分:0)
这是因为按 Enter 的'\n'
输入也被scanf()
使用。你可以使用
scanf(" %c", &secretLetter);
放弃这些空格(包括' '
,'\t'
,'\n'
等等。