はじめに

こんにちは!くらみぃです。
10 月から私は インテル® SoCや Nios® II を中心にサポートするチームに配属となりました。
製作実習の時に使う言語はハードウェア言語( HDL )だけだったのですが、これからは C 言語などのソフトウェア言語も身に付けるべく、ただ今勉強中です。

そこで今回は、 C 言語を学んでいく中で感心した出来事について、記事を書きたいと思います。

getchar() とは

先日、私は「 getchar() 」という関数について学びました。これは、「キーボードからの入力を1文字返す」という関数です。
図 1 は、キーボードから入力した文字を 1 文字を返して char 型の変数 ch に代入し、その後 ch に格納されている文字を、 printf() によって画面に表示させるプログラムです。

図 1

例えば、図 2 のように「 altima 」と入力した場合、画面に表示される文字は、「 a 」となります。(図 3 )

図 2
図 3

ループ文を使うと…

今度は、ループ文を使って文字を何回も入力してみようと、図 4 のようなコードを作ってみました。

図 4

コードが出来たので、さっそく「 altima 」と入力してみたところ、なんと!
1文字だけでなく文字列が画面に表示されるではありませんか!!(図 5)

私の予想では、「 altima 」と入力しても「 a 」としか表示されず、キーボードからの入力待ちになることを予想していました(図 6 )

図 5
図 6

なぜループさせたら複数の文字が表示できるようになったのか、まったく理解できませんでした。そこで、同じチームのぽき先輩に聞いてみたところ、どうやら「ラインバッファ」というものの恩恵を受けていたことがわかったのです。

ラインバッファとはどんなものなのか、教わったことをご説明したいと思います。

ラインバッファのおかげで…!

ラインバッファとは、改行コードが入力されるまでのデータなどを、一時的に保存しておくメモリです。

getchar() を使用すると、キーボードから入力され、 ENTER を押されるまでの文字列は、一時的にラインバッファに保存されます。今回の場合ですと、「 altima 」という文字列がラインバッファに保存されます。(図 7 )

すると、 printf () を使って画面に表示しようとするとき、最初に入力した文字が出力されます。 altima と入力していったので、「 a 」が画面に表示されます。

図 7, 出力前のラインバッファの中身
図 8, 出力後のラインバッファの中身

この処理が繰り返されることで、最後に入力した「 ¥n 」という改行コードまで出力され、入力待ちになります。
結果として、図 4 のコードは、図 5 のように出力されます。

まとめ

「 getchar() を使って 1 文字を返し、その文字を printf() で表示させる」コードをループさせることで、あたかも「入力した文字列をすべて返して、その文字列を printf() で表示させている」ように出来ました。 ラインバッファの恩恵に感謝ですね。感動に浸っていたところ、同じチームのぽき先輩から一言。
「まあ、scanf() 文を使えばフォーマット指定子に %s を選ぶことでキーボードから入力した文字列を返すことが出来るけどね。」
さらに、 getchar() の値の扱える範囲が -128~127 なのに対し、 scanf() の値の扱える範囲は -32768~32767 と知りました。扱える範囲も scanf() のほうが広いですね。
これから文字列を返したいときは、 scanf() を使おうと思います。。

C 言語は奥が深いです。
次回記事もぜひご覧ください!