前のページの/* 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になっています。 |
標準入力バッファの記憶内容を以下に示す。 (データが記憶される範囲をこの色で示す)