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

scanf の動作 詳細 戻り値

ほとんどの関数に戻り値があること説明をしました。 fscanf(scanfも同じ)も、戻り値をもっています。
この戻り値は、『変数にセット設定できたデータの個数』です。
(正確にいうと変数とは限りません。引数で指定した『アドレスが指し示す記憶域』にセットした個数です。)以下に  3つの実行例と、そのプログラムを示します。

2つ入力>10 20          
2個入力できました
10, 20
2つ入力>30 40
2個入力できました
30, 40
2つ入力>10 20 30 40   
2個入力できました
10, 20
2つ入力>2個入力できました
30, 40

2つ入力>10 a 30 40               
1個入力できました
10, 2
2つ入力>0個入力できました
3, 4

2回に分けたキー入力(赤)で、/*1*/と/*3*/のそれぞれのfscanfで、戻り値の2が変数nにセットされいいます。 2は、2つの変数に設定したという2です。 1回でキー入力(赤)しています。/*3*/では、バッファに残っているので入力待ちになりません。それを読み取って2つの変数にセットできているので、戻り値が2になっています。 1回でキー入力(赤)しています。%の指示に合う範囲しか読み取らないので、/*1*/のfscanfの戻り値はセットできた個数の1が戻り値になっています。 /*3*/では残ったバッファ内容が%dに合わないので、変数にセットされずに戻り値は0になっています。

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