初めてscanfが実行されるとキー入力待ちになります。
そして、キー入力者によって押された、Enterまでのキー情報は、
標準入力バッファと呼ばれる内部の記憶場所に記憶されます。
次にscanfは、第1引数の指定に従って、このバッファ内を走査(scan)し、
%直後の指示に従って合っている場合だけ文字の並びを取り出して動作しますが、
読み取るバッファが空になると再びキー入力待ちになります。
この時、バッファ内が指示と合わないとscanfの処理は終わります。
このscanfの第1引数("%d")などは、入力用フォーマットの文字列と呼ばれます。
%dなら、半角スペースやtab や Enterの改行文字を呼び飛ばして数字の並びを読み取り 、intに変換した後、所定のアドレスが指し示す位置の記憶内容を変更します。(通常は、変数の位置)
またscanfが実行するとき、バッファ内に、前の読み取り残しがあった場合に、
キー入力待ちにならないで、
残っていたバッファ内に対する読み取り処理が行われ、
バッファが空になった段階で、
キー入力待ちになります。
バッファリングの説明は、ここをクリックください。
以下のプログラムに対するいくつかの入力(赤)の実行例で説明します。
#include <stdio.h> main() { int k = 123; int n = 789; scanf("%d", & k); ←この2行は、次のように1行で書いても、下記説明の入力と同じ動作になります。 scanf("%d", & n); ← scanf("%d%d", & k , & n); printf("k=%d\n", k); printf("n=%d\n", n); }
入力例その1 | |
44 55 k=44 n=55 |
Enterやスペースだけ押しても、半角スペースやtab や Enterの改行文字を呼び飛ばして、 それによってバッファが空になるため、再びキー入力待ちになります。 |
入力例その2 | |
44 55 k=44 n=55 |
最初のscanfでEnterまでの入力全てがバッファに記憶される。そして%dに合っている範囲の44だけが読み取られる。 これで、%dが指示が終わって最初のscanfが終了する。この時バッファに『 55』の情報が残り、 それで次のsacnfはキー入力待ちにならず、残ったバッファ情報から55が読み取られる。 |
入力例その3 | |
4a 55 k=4 n=789 |
最初のscanfでEnterまでの入力全てがバッファに記憶される。そして%dに合っている範囲の数字4だけが読み取られる。 バッファに『a 55』の情報が残るため、 次のsacnfはキー入力待ちにならない。 残ったバッファ情報の先頭a は%dの指定と合わないので2行目のscanfは変数nへの設定をしないで終わり、 次の命令へ進んでいます。 |