如果在此代码块中输入了一个或多个字符,我将如何清除缓冲区。
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)。我知道这不会工作,我打电话给他。我还有什么方法可以验证是否输入了数字。
答案 0 :(得分:1)
void flush_stdin ()
{
char c;
do
{
c = get(stdin);
}while(c != EOF && c != '\n');
}
我在自己的代码中使用它,基本上,读取stdin中的每个字符,直到遇到它现在为空的符号。
我也会敦促避免使用scanf,但更喜欢将fread与sscanf一起使用,这样就可以限制输入字符的数量,避免缓冲区溢出和其他令人讨厌的事情。
答案 1 :(得分:0)
不要尝试在错误读取时刷新输入缓冲区,而是始终使用fgets()/sscanf()
读取整行。
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);