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