今天我写了一个程序,其中我使用了scanf()。该程序是正确的,但是当我调试它时,即使我按下回车键,程序也在等待输入,直到我按下另一个数字/字符然后再次按下回车键才显示结果。在那一刻,它显示了输入的计算值。我检查了我的代码,发现我在格式说明符之后放置了一个空格。当我删除空间时,它工作正常。
`scanf("%d ",&a);`
这种行为的原因是什么?
今天我写了一个程序,其中我使用了scanf()。该程序是正确的,但是当我调试它时,即使我按下回车键,程序也在等待输入,直到我按下另一个数字/字符然后再次按下回车键才显示结果。在那一刻,它显示了输入的计算值。我检查了我的代码,发现我在格式说明符之后放置了一个空格。当我删除空间时,它工作正常。
`scanf("%d ",&a);`
这种行为的原因是什么?
I/O 已缓冲,您需要刷新它。
与<stdio.h>
呼叫例如fflush(NULL)
或fflush(stdout)
。阅读fflush(3)和相关的手册页。
使用 C++ iostream 执行cout << std::flush
or cout.flush
(或者,正如jodag所评论的那样,执行 acout << std::endl
输出换行符然后刷新)。阅读有关std::flush等的信息。
并且scanf("%d ",&a)
读者必须在数字之后获取非数字字符(可能是空格,或者获取行尾或文件尾)。阅读scanf(3)手册页。
我确实建议在您之前刷新标准输出scanf
(有时但并非总是自动完成)
顺便说一句,输入数字的首选 C++ 方式可能是
std::cin >> a;
您的问题的答案在格式说明符(空白部分)的描述中: http ://www.cplusplus.com/reference/cstdio/scanf/
该函数将读取并忽略在下一个非空白字符之前遇到的任何空白字符(空白字符包括空格、换行符和制表符——参见 isspace)。格式字符串中的单个空格验证从流中提取的任意数量的空格字符(包括无)。