1

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

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

4

2 回答 2

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

I use this in my own code, basically, read every character in stdin until you encounter a sign that it is now empty.

I ll also urge to avoid scanf, but prefer using fread with sscanf, so you can limit the number of input character, wich avoid buffer overflow and other nasty things.

于 2014-02-07T15:24:06.190 回答
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);
于 2014-02-07T15:38:11.497 回答