3 回答
TA贡献1809条经验 获得超8个赞
程序将无法正常工作,因为在第1行,当用户按Enter时,它将留在输入缓冲区2字符中:Enter键(ASCII代码13)和\n(ASCII代码10)。因此,在第2行,它将读取\n,而不会等待用户输入字符。
您在第2行看到的行为是正确的,但这不是完全正确的解释。对于文本模式流,不管平台使用什么行尾(无论是回车返回(0x0D)+linefeed(0x0A)、裸CR还是裸LF)。C运行时库将为您处理这个问题:您的程序将只看到'\n'
换新线路。
如果键入一个字符并按Enter键,则该输入字符将按第1行读取,然后'\n'
将由第2行读取。看见我在用scanf %c
读取Y/N响应,但稍后将跳过输入。
至于拟议的解决办法,见(同样来自于comp.lang.c FAQ):
如何才能刷新挂起的输入,这样用户的打字机就不会在下一个提示符中读取?将要
fflush(stdin)
工作?如果
fflush
不会工作,我能用什么来冲洗输入?
从根本上说,唯一的可移植方法是:
int c;while ((c = getchar()) != '\n' && c != EOF) { }
你的getchar() != '\n'
循环工作,因为一旦您调用getchar()
,返回的字符已经从输入流中删除。
另外,我觉得有义务劝阻你不要使用scanf
完全:为什么每个人都说不要用scanf
?我应该用什么代替?
TA贡献1866条经验 获得超5个赞
int ch;while ((ch = getchar()) != '\n' && ch != EOF) ;
'\n'
fflush()
- 3 回答
- 0 关注
- 659 浏览
添加回答
举报