====================================================================================================================================
一、先看看如下代码片段,test.c
#include <stdio.h>
int main(){
int etype; int type; int code; int value;
whlie(1){
etype = 0; type = 0; code = 0; value = 0;
printf("please input 4 int:\n");
scanf("%d",&etype); fflush(stdin);
scanf("%d",&type); fflush(stdin);
scanf("%d",&code); fflush(stdin);
scanf("%d",&value); fflush(stdin);
printf("etype:%d,type:%d,code:%d,value:%d\n",etype,type,code,value);
}
return 1;
}
gcc -o test test.c
这个程序首先会提示用户输入一组整数,然后等待用户输入,如果用户输入的是整数,程序会输出刚才输入的整数,并且再次提示用户输入下一组整数,然后等待用户输入。但是一旦用户输入的不是整数(如小数或者字母),假设scanf函数最后得到的一组整数是2、3、4、a,那么程序会不停地输出如下:
please input 4 int
etype:0,type:0,code 0,value:0
这是因为scanf("%d", &i)只能接受整数,如果用户输入了字母,则这个字母会遗留在“输入缓冲区”中(
gcc编译器不支持fflush(stdin)清空输入缓冲区)。因为缓冲中有数据,故而scanf函数不会等待用户输入,直接就去缓冲中读取,可是缓冲中的却是字母,这个字母再次被遗留在缓冲中,如此反复,从而导致不停地输出上述。
二、我们在看另外一个案例,test.c
#include <stdio.h>
int test;
void test();
int main(){
do{
printf("please input 0 or 1\n");
printf("0 is exit!\n");
printf("1 is test!\n");
scanf("%d",&test); fflush(stdin);
if(test == 1) test();
else test = 0;
}while(test);
return 0;
}
void test(){
char str[80];
do{
printf("please input:\n");
gets(str);
printf("str is %s",str);
}while(1);
}
gcc -o test test.c
执行后,首先输出如下:
please input 0 or 1
0 is exit!
1 is test!
输入1,按回车;输出如下:
please input:
please input:
原因其实和《一》相同。
====================================================================================================================================
三、最后介绍一种移植性比较高的清空输入缓冲区办法
int c;
while((c = getchar()) != '\n' && c != EOF);