====================================================================================================================================
一、先看看如下代码片段,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);