scanf の動作 詳細 (2)

scanf や fscanf の動作 詳細 入力フォーマット

前のページの/* 2 */ のコメント行に、fscanf(stdin, "\na"); を追加記述したプログラム例を示します。
scanf や fscanf で使う  "%d%d"  "\na" は、入力用フォーマットと呼ばれ、バッファからの読み取り指示になります。
入力用フォーマットでは、次の引数で示す記憶域への設定指示を行う%以外に、 "\na" のような指示やその混在も可能です。
 "\na" の指示は、『'\n' の指示で処理した後、'a'の文字を読み取り除け。但し指示と合わなければ中断せよ。』の意味です。
そして、"\n"の指示は、『半角スペースやtab や Enterの改行文字があれば、それらを読み取り除け』と言う指示になっています。 この半角スペースやtab や Enterの改行文字は、空白文字と呼ばれます。

なお、"\n"の指示は、 " "と同じです。そして、それらは何個並べても同じ意味になります。
空白文字あれば、読み取り除け』ということは、無ければ何もしないので、 最初の指示で空白文字が除かれると、残りの\nの指示ではなにもしないのです。
つまり、 『"   \n  \n a"』は、『"\na"』の入力フォーマットと同じ意味になります。

前のページの/* 2 */ のコメント行に、fscanf(stdin, "\na"); を 追加記述したことにより右の実行結果だけが変わります。
左と中央の実行結果は、"\na"の中の'a'を読み取り除く指示が合わないので、
fscanf(stdin, "\na"); を中断していますが、fscanf(stdin, "\na"); がない場合と同じ実行結果になります。

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つ入力>2個入力できました
30, 40

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


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