Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
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 - Fatal编程技术网

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);