Back to Blog

fflush(stdin)和fflush(stdout)

#input#多线程#平台#windows#编程#网络

这个程序的目的是从标准输入获取一个整数并立即打印,然后获取一个字符串并立即打印。在理想情况下,用户会先输入一个整数,然后输入一个字符串。然而,如果用户在第一行输入了多个数据,例如 123 456,会发生什么呢?

cin >> a; 执行时,它会读取 123 并将其存储到 a 中。此时,输入缓冲区中仍然残留着 456 以及随后的空格或换行符。接下来,程序立即执行 cin >> str;。此时,cin 不会等待用户输入新的字符串,而是会直接从缓冲区中读取剩余的 456,并尝试将其存储到 str 数组中。这可能导致 str 接收到非预期的内容,甚至可能因为缓冲区溢出而引发程序错误(如果 456 后面还有更多字符导致超出 str 的容量)。

这种行为虽然在某种程度上是用户操作不规范造成的,但一个健壮的程序应该能够预测并处理这类情况。程序员可以通过在程序界面上提供清晰的提示,例如“请输入1个整数”,甚至在必要时强调和警告用户。然而,在某些情况下,直接清理输入缓冲区是更直接有效的解决方案。

为了解决上述问题,我们可以在 cin >> str; 语句之前插入 fflush(stdin);。这样一来,在尝试读取字符串之前,输入缓冲区中所有多余的数据(例如之前输入的 456)都会被清空。