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

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

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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值