博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
fflush(stdin)在gcc编译器中不起作用?
阅读量:4180 次
发布时间:2019-05-26

本文共 1650 字,大约阅读时间需要 5 分钟。

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

一、先看看如下代码片段,test.c

#include 
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 
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);

转载地址:http://ahgai.baihongyu.com/

你可能感兴趣的文章
matlab基础知识
查看>>
程序员的职业素养
查看>>
一道面试题深入了解java底层
查看>>
java下载附件
查看>>
cron表达式每个月最后一天
查看>>
Oracle中Like与Instr模糊查询性能大比拼
查看>>
Spring Boot入门===Hello World
查看>>
spring boot应用启动原理分析
查看>>
使用spring的好处
查看>>
微服务:分解应用以实现可部署性和可扩展性
查看>>
tcp_timestamps tcp_tw_recycle引起的服务器连接不上问题
查看>>
windows下ES和head插件的安装
查看>>
RAP一种更高效的前后端接口对接解决方案
查看>>
ELK(ElasticSearch, Logstash, Kibana)搭建实时日志分析平台
查看>>
ELK搭建教程(全过程)
查看>>
maven私服搭建使用
查看>>
Netty学习路线总结
查看>>
基于mybatis拦截器实现数据权限
查看>>
分布式文件系统FastDFS详解
查看>>
centos7上rabbitmq搭建
查看>>