以下代码在运行时会产生一个非常奇怪的结果。
#include <stdio.h>
#include <stdlib.h>
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,但他们不知道如何解决它。
有人请帮助我!
答案 0 :(得分:9)
这是因为您输入 w 后跟 ENTER 。因此,输入中有2个字符'w'
,后跟换行符(\n
)。后者导致在第二次迭代时采用else
分支。
请注意,标准输入在连接到终端时是线路缓冲的。如果你需要立即处理角色,有办法做到这一点。有关详细信息,请参阅comp.lang.c FAQ(“如何在不等待RETURN键的情况下从键盘读取单个字符?如何在键入字符时阻止字符在屏幕上回显?”)。
请注意,对于健壮的编程,必须检查scanf
的返回值。它返回成功转换的项目数。如图所示,您的代码无法正确处理文件结尾的情况,即当用户键入 Ctrl-D (假设是Unix终端)时。然后scanf返回EOF
并且未执行转换,但您使用test
,就好像它包含有意义的值。
答案 1 :(得分:2)
'\n'
在格式说明符" %c"
的开头添加空格会忽略换行符'\n'
scanf(" %c", &test);
使用" %c"
也会缩小其他空白位置,例如\t
space
\b
\v
\r
答案 2 :(得分:0)
正如Jens所说,你必须消费'\n'
,在getchar()
之后使用scanf()
答案 3 :(得分:0)
答案 4 :(得分:0)