参考:scanf の動作 詳細 戻り値

fscanf と fflush関数

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