验证输入并清除键盘缓冲区

时间:2014-02-07 15:20:41

标签: c while-loop do-while fflush

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

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)。我知道这不会工作,我打电话给他。我还有什么方法可以验证是否输入了数字。

2 个答案:

答案 0 :(得分:1)

void flush_stdin ()
{
    char c;
    do
    {
        c = get(stdin);
    }while(c != EOF && c != '\n');
}

我在自己的代码中使用它,基本上,读取stdin中的每个字符,直到遇到它现在为空的符号。

我也会敦促避免使用scanf,但更喜欢将freadsscanf一起使用,这样就可以限制输入字符的数量,避免缓冲区溢出和其他令人讨厌的事情。

答案 1 :(得分:0)

不要尝试在错误读取时刷新输入缓冲区,而是始终使用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);