Enterまでのキー入力情報は、 stdinで管理される標準入力バッファ と呼ばれる内部の記憶場所に記憶されます。
こらは、stdinのストーリムで管理さ、fsacnfの入力用フォーマットの文字列で読み取られます。
標準入力バッファの内容がこの入力用フォーマットに合わないと、
fscanfの処理が終わります。
この時、標準入力バッファの中に、データが残ったままになっており、
次の入力ではすぐ入力待ちにならずに、このバッファの内容が読み取り対象になります。
場合によって、このバッファにデータが残っていると、次の入力に支障がある場合があります。
このような時のために、
このバッファの読み取り残しをクリアする
fflush(バッファを管理するストリーム)命令があります。
fflush関数は、stdio.hをインクルードすることで使えます。
次の実行例を行うプログラムで説明します。(赤が入力)
2つ入力>10 ab 1個入力できました 10, 2 2つ入力>0個入力できました 2つ入力>30 40 2個入力できました 30, 40
#include <stdio.h>
main()
{
int a=1;
int b=2;
int c=3;
int d=4;
int n;
fprintf(stdout, "2つ入力>");
n = fscanf(stdin, "%d%d", &a, &b ); /* 1 */
fprintf(stdout, "%d個入力できました\n", n);
fprintf(stdout, "%d, %d\n", a, b);
fprintf(stdout, "2つ入力>");
n = fscanf(stdin, "%d%d",&c , &d ); /* 2 */
fprintf(stdout, "%d個入力できました\n", n);
fflush( stdin );
fprintf(stdout, "2つ入力>");
n = fscanf(stdin, "%d%d",&c , &d ); /* 3 */
fprintf(stdout, "%d個入力できました\n", n);
fprintf(stdout, "%d, %d\n", c, d);
}
このプログラムのn = fscanf(stdin, "%d%d", &a, &b );の実行で、
次の10 abの入力を行ったとします。
標準入力バッファの記憶内容を以下に示す。 (データが記憶される範囲をこの色で示す)
2つ入力>10 ab 1個入力できました 10, 2 2つ入力>0個入力できました 2つ入力>30 40 2個入力できました 30, 40