Else语句总是在if和if else之后运行

时间:2016-02-19 22:47:42

标签: c

#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 ......这没有任何意义。

3 个答案:

答案 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'等等。