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つの入力しかしていないので、右端の実行例のように余計に並べても
同じ結果になります。
これを、最後まで行わせるには、次のように繰り返しが必要です。
標準入力バッファの記憶内容を以下に示す。 (データが記憶される範囲をこの色で示す)