scanf
キーが押されたときに入力のスキャンが開始されるようEnterです。これを以下のコードで確認したいと思います (簡単にするために、エラー チェックと処理を省略しました)。
#include <stdio.h>
int main(int argc, char **argv) {
/* disable buffering */
setvbuf(stdin, NULL, _IONBF, 0);
int number;
scanf("%d", &number);
printf("number: %d\n", number);
return 0;
}
ここで別の問題が発生します。入力バッファリングを無効にした後 (結果を確認するためです。結果に干渉する場合に備えて、実際には絶対にそうすべきではないことがわかっています)、出力は次のようになります (余分なプロンプトに注意してください)。
$ ./ionbf
12(space)(enter)
number: 12
$
$
これは、入力バッファリングが有効になっている場合の出力とは異なります (追加のプロンプトはありません)。
$ ./iofbf
12(space)(enter)
number: 12
$
バッファを有効にすると改行文字が消費されるようです。gcc 4.1.2 と bash 3.2.25 がインストールされたマシンと、gcc 4.4.4 と bash 4.1.5 がインストールされたマシンの 2 つの異なるマシンでテストしましたが、結果はどちらも同じでした。
問題は次のとおりです。
- 入力バッファリングが有効な場合と無効な場合の異なる動作を説明するにはどうすればよいですか?
- 元の問題に戻ると、
scanf
はいつユーザー入力のスキャンを開始しますか? 文字を入力した瞬間?それとも、行が完了するまでバッファリングされますか?