C scanf(“%c”)的问题是逐个读取字符的function

以下代码在运行时会产生一个非常奇怪的结果。

#include  #include  int main(void) { for ( ; ; ) { char test; printf("Please enter 'w' "); scanf("%c", &test); printf("%c\n", test); if (test == 'w') { printf("Working\n"); } else { printf("ERROR\n"); return 0; } } } 

我想要发生的是每当我输入’w’时它继续循环,所以我可以再次输入’w’。 虽然我输入’w’,它的作用是转到else语句。 它似乎跳过了scanf()行。 我问过我认识的每个人谁知道C,但他们不知道如何解决它。

有人请帮帮我!

这是因为你键入w后跟ENTER 。 因此输入中有2个字符'w' ,后跟换行符( \n )。 后者导致在第二次迭代时采用else分支。

请注意,标准输入在连接到终端时是线路缓冲的。 如果你需要立即处理角色,有办法做到这一点。 有关详细信息,请参阅comp.lang.c常见问题解答 (“如何在不等待RETURN键的情况下从键盘读取单个字符?如何在键入字符时阻止字符在屏幕上回显?”)。

请注意,对于稳健的编程,必须检查scanf的返回值 。 它返回成功转换的项目数。 如图所示,您的代码无法正确处理文件结尾的情况,即当用户键入Ctrl-D (假设是Unix终端)时。 然后scanf返回EOF并且没有执行转换,但是您使用test就好像它包含有意义的值。

正如詹斯所说。 你必须忽略换行符'\n'

在格式说明符" %c"的开头添加空格将忽略换行符'\n'

 scanf(" %c", &test); 

使用" %c"也会使其他空格如\t \b space \b \v \r

正如Jens所说,你必须消耗'\n' ,在scanf()之后使用getchar() scanf()

你需要做点什么

  scanf("%c", &test); while(getchar()!='\n'); 

scanf将输入带到空格或\n (以先到者为准)并将\n留在缓冲区中

只是好奇你在窗户上试试吗? 你可以尝试flushall();