fflush(stdin)はgccコンパイラで機能しませんか?

2508 ワード

====================================================================================================================================
一、まず次のコードの断片を見てみましょう.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:
"); 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
",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関数はユーザの入力を待つことなく、そのままバッファに読み取りに行くが、バッファにはアルファベットが残り、このアルファベットが再びバッファに残され、このように繰り返し、上記を出力し続ける.
もう一つのケースを見ていますc
#include <stdio.h>
int test;
void test();
int main(){
  do{
    printf("please input 0 or 1
"); printf("0 is exit!
"); printf("1 is test!
"); 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:
"); 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()) != '
' && c != EOF);