scanf や fscanf の動作 詳細

scanf を繰り返し条件で使う。

scanfやfscanfの戻り値は、設定できたデータの数でした。
これを利用すれば、変数に正しく設定できたかが分かります。 例えば、次のような記述で、変数a と b の2つに設定できたかが分かるわかるわけです。

	if(fscanf(stdin, "%d%d", &a, &b) == 2){
			/* 正しく入力できた時の処理 */
	}

次は、1つの変数dに正しくデータが記憶できた場合だけ、それをsum に追加している例です。

#include <stdio.h>
main()
{
	int d = 0; /* 入力用 */
	int sum = 0; /* 合計 */
	int n; /* 入力個数 */
	n = 0;
	if(fscanf(stdin, "%d" , &d) == 1){/* 入力して、変数1 つに正しくセットできたか?*/
		fprintf(stdout, "d=%d\n",d);
		sum += d;
		n = n + 1;
	}
	if(fscanf(stdin, "%d" , &d) == 1){/* 入力して、変数1 つに正しくセットできたか?*/
		fprintf(stdout, "d=%d\n",d);
		sum += d;
		n = n + 1;
	}
	if(fscanf(stdin, "%d" , &d) == 1){/* 入力して、変数1 つに正しくセットできたか?*/
		fprintf(stdout, "d=%d\n",d);
		sum += d;
		n = n + 1;
	}
	fprintf(stdout, "%d 個の合計は、%d です\n", n, sum);
}

以下に実行例を示します。(が入力です)

4 =
d=4
1 個の合計は、4 です




4 3 =
d=4
d=3
2 個の合計は、7 です



4 3 6
d=4
d=3
d=6
3 個の合計は、13 です


4
d=4
3
d=3
6
d=6
3 個の合計は、13 です
4 3 6 5 7
d=4
d=3
d=6
3 個の合計は、13 です


= の入力では%d 指定合わないので、fscanf の戻り値が0 になっています。 そして、バッファにそのデータが残るため、それ以降で、if 文は成立していません。
プログラムで3つの入力しかしていないので、右端の実行例のように余計に並べても 同じ結果になります。
これを、最後まで行わせるには、次のように繰り返しが必要です。

標準入力バッファの記憶内容を以下に示す。 (データが記憶される範囲をこの色で示す)