scanf の動作 詳細 その2

scanfの機能は複雑で、次のように動きます。

初めてscanfが実行されるとキー入力待ちになります。
そして、キー入力者によって押された、Enterまでのキー情報は、 標準入力バッファ と呼ばれる内部の記憶場所に記憶されます。
次にscanfは、第1引数の指定に従って、このバッファ内を走査(scan)し、 %直後の指示に従って合っている場合だけ文字の並びを取り出して動作しますが、 読み取るバッファが空になると再びキー入力待ちになります。 この時、バッファ内が指示と合わないとscanfの処理は終わります。 このscanfの第1引数("%d")などは、入力用フォーマットの文字列と呼ばれます。

%dなら、半角スペースやtab や Enterの改行文字を呼び飛ばして数字の並びを読み取り 、intに変換した後、所定のアドレスが指し示す位置の記憶内容を変更します。(通常は、変数の位置)

またscanfが実行するとき、バッファ内に、前の読み取り残しがあった場合に、 キー入力待ちにならないで、 残っていたバッファ内に対する読み取り処理が行われ、 バッファが空になった段階で、 キー入力待ちになります。
バッファリングの説明は、ここをクリックください。

44  
55  
66
i=44
k=55
n=66                    
44  55  66
i=44
k=55
n=66

                    
前回のプログラムに対して、変数を増やして3つの入力を行っている例を、2通り紹介しています。 %dの指示に合う数字の入力であれば、入力の順番通りで、正しくデータが設定されます。

44  5A  66 と正しい入力でない場合の実行例を以下に示します。

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