fflush(stdin)在gcc编译器中不起作用?

来源:互联网 发布:安妮宝贝老公 知乎 编辑:程序博客网 时间:2024/06/04 00:41

====================================================================================================================================

一、先看看如下代码片段,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 intetype: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 10 is exit!1 is test!
输入1,按回车;输出如下:

please input:please input:

  原因其实和《一》相同。

====================================================================================================================================

三、最后介绍一种移植性比较高的清空输入缓冲区办法

int c;while((c = getchar()) != '\n' && c != EOF);



原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 老人餐后血糖高怎么办 血糖高尿糖不高怎么办 小孩鼻子不通气怎么办特效方法 婴儿20天不大便怎么办 新生儿8天没大便怎么办 新生儿2天没大便怎么办 新生儿4天没大便怎么办 2岁宝宝便秘严重怎么办 婴儿7天没有大便怎么办 新生儿6天没大便怎么办 大便带鲜血 不疼怎么办 宝宝发烧到39度怎么办 肛裂大便出鲜血怎么办 拉大便有血怎么办啊 长痔疮拉大便血怎么办 病人卧床太久不解大便怎么办 宝宝拉泡沫便便怎么办 孩子拉肚子怎么办呢有好办法吗 2岁宝宝大便带血怎么办 十个月宝宝肛裂怎么办 大便时拉出血怎么办啊 2岁宝宝大便干燥怎么办 5岁儿童大便干燥怎么办 九个月宝宝平血怎么办 6个月宝宝肛裂怎么办 3岁儿童大便干燥怎么办 外痔疮出血了该怎么办 外痔疮流血了怎么办呢 外痔疮破了出血怎么办 拉稀拉的肛门疼怎么办 大人屁股沟裂了怎么办 肛门痛大便有血怎么办 肛裂出血几天了怎么办 肛裂拉屎出血该怎么办 孕期肛裂出血该怎么办 老人大便拉不出来怎么办 拉屎拉的屁眼疼怎么办 拉屎堵在肛门口怎么办 上火拉大便有血怎么办 7岁儿童大便带血怎么办 阴炎用药后出血怎么办