c - fflush\flushall()\_flushall() 等不会清除 C 中的缓冲区

标签 c visual-studio

在我需要为项目执行的所有程序中,我遇到了输入缓冲区问题,到目前为止,我用 while 循环清理了它,但现在有人告诉我不要这样做(你可以看到它被注释掉了).

我尝试使用 flushall()、_flushall() 和 Visual Studio 提供给我的所有替代方案,但没有一个能解决问题。

我做错了什么?

    while (speed <= 0 || distance <= 0 || (distance == -1 || speed == -1))
    {

        scanf(" %d %d", &distance, &speed);
        //while (getchar() != '\n');


   }

最佳答案

在大多数情况下,真正的技术是根本不要尝试刷新 stdin

为此,每次都必须以相同的方式与 stdin 进行交互。实际上,这通常相当于不混合输入样式。

如果使用格式化输入(如 scanf()),切勿使用面向行的输入(例如 fgets())或面向字符的输入(例如 getc ()) 在同一流上。同样,如果使用 fgets() 进行读取,切勿在同一流上使用格式化输入或面向字符的输入。

等等。

原因是不同风格的输入对某些特定字符的 react 不同——尤其是换行符和空格。当您混合这些输入方式时,会出现不需要的交互。例如,scanf() 在遇到换行符 ('\n') 时通常会停止读取,并将该换行符留在流中。另一方面,fgets() 也会在到达换行符时立即停止,但会从流中删除该换行符。因此,如果 scanf() 调用后跟 fgets( ..., stdin),则 fgets() 调用通常会返回立即 - 不读取预期的数据。

此外,如果使用scanf(),则必须谨慎选择格式字符串,以避免后续调用之间的一些交互。

关于c - fflush\flushall()\_flushall() 等不会清除 C 中的缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33324292/

相关文章:

c - Hackerrank 圆形阵列旋转分割错误

git - Visual Studio 是否可以要求将工作项链接到 git 提交?

c++ - 静态变量和常量变量有什么区别?

visual-studio - 无法设置下一个语句。下一条此时无法更改

visual-studio - 如何在 Visual Studio 中按代码块导航/移动光标

c# - 列出所有 `throw new NotImplementedException()` 方法的任何 VS C# 方法?

visual-studio - Visual Studio 2013 Update 4 已损坏 Web 模板

c - 为什么这个 C 程序执行在通过 scanf() 输入时停止工作?

c - 在c中使用枚举形成位图

c - 从文件中读取值 - 有些是正确的,有些是不正确的