在阅读完之前的问题之后,请确定:
Alternate method for clearing input buffer in c
How to clear input buffer in C?
我想出了一段代码来清空输入缓冲区并计算缓冲区中有多少个值,然后返回这个数字。然后进行比较以检查该数量是否超过允许的数量。
#include <stdio.h>
#include <stdlib.h>
int Empty();
int main()
{
double x;
int y=0;
while(y==0)
{
y=1;
if(scanf("%lf",&x)!=1 || Empty()>1) //checks if the value is acceppted
// and then attempts to empty
// the input buffer. I always expect
//at least 1 returned due to the
// EOF or '\n'
{
fprintf(stdout,"Invalid character(s) entered, please re-enter.\n");
y=0;
}
}
return(x);
}
int Empty()
{
int clearr,n=0;
do
{
n++;
}while((clearr=fgetc(stdin))!= EOF && clearr !='\n'); // If EOF or '\n' is reached
// it ends, returning the
//number of characters
return(n);
}
如果我然后运行程序并输入2或2.2等,则接受并返回该号码。
如果我输入2a,或2 a或2 2等,它总是捕获空格/字母/等并强制使用SINGLE循环以允许您尝试重新输入值
但是,如果输入有问题的项目,即a,则首先发生无限循环。
这对我来说没有意义,因为根据我的理解,当fgetc(stdin)
被调用时,它必须拉一个字符或EOF
表示只输入一个项目,结束循环。
答案 0 :(得分:1)
在测试if( A || B )
中,如果A为真,则B 不进行评估。
因此,如果scanf("%lf",&x)!=1
为真,则不会调用Empty()
,并且您的循环会一直持续。
这里的一个问题是你试图一次做几件事,建议是:
所以1)扫描输入,2)如果它可以继续,3)如果它没有冲洗并重复。
答案 1 :(得分:1)
如果输入a,scanf("%lf",&x)
将给出0,因此它永远不会调用Empty。