Else语句总是在if和if-Else之后运行 #包括 int main(int argc,const char*argv[]{ //跑。。。 printf(“--------------计算-----------------\n”); printf(“(1)键入一封信以获得一条秘密消息:”); int validSecret=0; 字符密信; while(validSecret==0){ scanf(“%c”和secretLetter); 如果(secretLetter=='b'){ printf(“B\n”); } else if(secretLetter=='r'){ printf(“R\n”); } else if(secretLetter='k'){ printf(“K\n”); } 否则{ printf(“游戏结束”\n); validSecret=1; } } 返回0; }
如果我输入Else语句总是在if和if-Else之后运行 #包括 int main(int argc,const char*argv[]{ //跑。。。 printf(“--------------计算-----------------\n”); printf(“(1)键入一封信以获得一条秘密消息:”); int validSecret=0; 字符密信; while(validSecret==0){ scanf(“%c”和secretLetter); 如果(secretLetter=='b'){ printf(“B\n”); } else if(secretLetter=='r'){ printf(“R\n”); } else if(secretLetter='k'){ printf(“K\n”); } 否则{ printf(“游戏结束”\n); validSecret=1; } } 返回0; },c,C,如果我输入ab,If语句将正确执行并打印a b和新行,但也会打印游戏结束。它正在运行if和else。。。这毫无意义。读取输入后,需要刷新输入缓冲区,如下所示 #include <stdio.h> int main(int argc, const char * argv[]) { //run... printf("----------------CALC--------------\n"); printf("(1) Type in a letter to get a secret me
a
b
,If语句将正确执行并打印a b和新行,但也会打印游戏结束。它正在运行if和else。。。这毫无意义。读取输入后,需要刷新输入缓冲区,如下所示
#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;
}
这是为了使用换行符之前(包括换行符)的所有字符。原因是
scanf
一看到'\n'
就停止读取,因此它将其留在inpu缓冲区中。另外,切勿使用fflush(stdin)
刷新,因为这是不可移植的。您输入的换行符(对应于'\n'
字符)与任何其他条件都不匹配;当然,您的代码将因此而采用else
分支
stdin
是否可能达到EOF
?您的代码忽略了返回值,因此无法检测此类场景。。。它应该看起来更像:
void flush()
{
while (getchar() != '\n')
;
}
注意我是如何将您的else
转换为else if(secretLetter!='\n')
?这将防止在secretLetter
为\n
时打印“游戏结束”,从而解决第一个问题
还要注意我是如何使循环的终端条件与scanf的故障相匹配的?这将防止循环在stdin
达到EOF
时继续。您可能需要移动printf(“游戏结束\n”)代码>到循环外部以对此进行说明
这里不需要中间变量来代替break
;您应该不惜一切代价避免不必要的混乱。这是因为按Enter键输入的'\n'
也会被scanf()
消耗。你可以用
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;
}
}
丢弃这些空白(包括'
,'\t'
,'\n'
和其他内容)。罪魁祸首是scanf(“%c”,&secretLetter)代码>。使用scanf(“%c”和secretLetter)
打印出读取的char
字符。想知道关于这个scanf(“%c”)(
issue@artm:大概有fflush(stdout)
之多,但不到fflush(stdin)
。我已经获得了20个回答此类问题的代表-所以现在每当我看到scanf(“%c”)..
我知道问题就在这里,不管这个问题(有些东西不起作用)听起来有多不一样:)
scanf(" %c", &secretLetter);