ログイン
kid's world

入力バッファ

入力バッファ

なぜEnterキーを押さなければ次へ進まなかったのだろうか。文字列の入力の仕組みについて知れば,その理由がわかってくる。

実は,ユーザがキーボードから文字を入力すると,すぐにプログラムに取り込まれるわけではない。入力された文字は,まず入力用のバッファに順番に蓄えられる。入力バッファは,文字が1列に並んだものだと思っていただければ間違いないだろう。キーボードから文字入力があると,割り込みせずに最後尾に入力された文字がどんどんと連なっていく。そして,getchar関数などで先頭から1つ1つ処理されていく。

したがって,プログラムは実際にはキーボードを直接監視するのではなく,入力バッファに蓄えられている文字を先頭から取り出す作業を行うことで,キーボードから入力された文字を得ることができるわけだ。

そして重要なことは,ほとんどのコンパイラで,1行ぶん入力されて初めて次の処理に進む「ラインバッファ」を実装しているということである。したがって,改行文字'\n'(Enterキーなどで入力する)が入力されるまで,getchar関数は文字を取り出さずに待ち状態になるのだ。なんだかめんどうな仕組みのように感じるが,このおかげで,ユーザはEnterキーを押すまで,入力した文字を修正できるという利便性を得ることができるのだ。Enterキーを押すまでgetchar関数のところで待ち状態になっていたのはそのためである。

たとえば,プログラムの実行中にユーザが「A」「B」「C」「Enter」キーと押したとしよう。すると,入力バッファはFig. 3の(a)の部分ような状態になる。

Fig. 3: 入力バッファの状態

/c/input-fig3.png

この図にも,今まで何度も出てきた'\n'という文字が出てきた。これはユーザが押した「キー」に対応する文字として,バッファに蓄えられる。Table 1のコード表には書いていないが,'\n'という文字も,表の空白部分の数値を使って表されている。

ともかく,このような状態で,getchar関数を呼び出すと,先頭の'A'が取り出される。すると,入力バッファはFig. 3の(b)の部分のようになる。

このまま放っておくと,プログラムが終了するまで,入力バッファにはこの3つの文字,'B','C','\n'が残り続けるが,ここでもう一度getchar関数を呼び出せば,'B'が得られて,残りは'C'と'\n'になる。この状態で,ユーザがほかの文字を打っても,以前の文字が上書きされて消えるようなことはない(Fig. 3-(c)の部分)。


数値を得る」へ進む

広告


©Toshio Koide 1996-2007.

目次

リンクについて

リンクは御自由にどうぞ。

メール

mail.gif

広告