【问题标题】:Verifying input, and clearing keyboard buffer验证输入并清除键盘缓冲区
【发布时间】:2014-02-07 15:20:41
【问题描述】:

如果在这段代码中输入了一个或多个字符,我将如何清除缓冲区。

int x = 1;
float grade = 0.0;

do
{
    printf ("Enter a grade for quiz %d: ", x);
    scanf ("%f", grade);

    if (grade >= 1 && grade <= 10) break;

    printf ("Entry not valid. Please try again\n");

} while (1);

我的导师坚持我们使用 fflush(stdin)。我知道这行不通,所以我打电话给他。我还有什么其他方法可以验证是否输入了数字。

【问题讨论】:

  • 您可以简单地使用 getline 方法读入,然后自己解析字符串以确保它是只有一个小数点的数字。验证后,您将转换为实际的数字类型,然后根据需要进行处理。
  • 为什么 fflush 不起作用?我用它,它很棒!我猜你用错了。
  • user689 如何正确使用 fflush?我在很多地方都放入了fflush(stdout),但是我的代码继续进入无限循环。
  • @user3284399 你应该做fflush(stdin),而不是fflush(stdout)。您的代码中也有错误,在scanf() 调用中应该是&amp;grade 而不是grade

标签: c while-loop do-while fflush


【解决方案1】:
void flush_stdin ()
{
    char c;
    do
    {
        c = get(stdin);
    }while(c != EOF && c != '\n');
}

我在我自己的代码中使用它,基本上,读取标准输入中的每个字符,直到你遇到它现在为空的标志。

我也强烈建议避免使用 scanf,但更喜欢使用 freadsscanf,这样您可以限制输入字符的数量,从而避免缓冲区溢出和其他讨厌的事情。

【讨论】:

  • 可能会选择一个 do-while,这样就不必进行初始 getchar 调用。
  • 谢谢,我试图记住我每次从一个项目到另一个项目的 c/p 代码,至少我在第一次尝试时做了一些功能
  • 完全听到你的声音。我总是需要回顾我的代码,而且很少能第一次在这里正确:-)
  • DrakenSAN 我不知道 sscanf 的存在,因为我是第一年的班级。谢谢先生。
  • @user3284399:别担心,我们都曾经和你一样。考虑阅读我提供的链接上的其他函数和库,所有 C 和 C++ 标准库都进行了描述和解释,对您编码有很大帮助; )。此外,考虑通过单击问题最佳答案左侧的绿色标记来接受答案,这有助于维护网站并为您和发表答案的人提供代表点。
【解决方案2】:

与其尝试在读取错误时刷新输入缓冲区,不如始终使用fgets()/sscanf() 读取整行。

例如Read_long

do
{
    char buf[50];
    printf ("Enter a grade for quiz %d: ", x);
    if (fgets(buf, sizeof buf, stdin) == NULL) 
        Handle_EOForIOError();
    if (sscanf(buf, "%f", grade) == 1 && grade >= 1 && grade <= 10) 
        break;
    printf ("Entry not valid. Please try again\n");
} while (1);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    相关资源
    最近更新 更多