こんにちは、ナナです。
プログラムにおいて、ユーザーとコミュニケーションを取りたいシーンが出てくることがあります。
getchar関数を利用することで、ユーザーと対話するようなプログラムを作ることができます。
本記事では次の悩みを解消する内容となっています。
では、getchar関数の使い方を学んでいきましょう。
getchar関数:標準ライブラリ関数を紹介
getchar関数は次の書式で構成されています。
#include <stdio.h>
int getchar(void);
「getchar」とは「get(取得)」と「character(文字)」を組み合わせたもので、ユーザーからのキー入力文字を取得するための関数です。
皆さんが押したキーボードからの文字情報をプログラムで受け取ることができるのが、この「getchar関数」なんです。
getchar関数の仕様
引数は必要なく、戻り値でキーボードから入力された文字が取得できます。
includeファイル | stdio.h |
関数仕様 | int getchar(void); |
引数 | なし |
戻り値 | 取得できた1文字。 「Ctrl + z」キーを押すことで「EOF」が取得される。 |
特記事項 | キーボードからEnterキーを押すことで、関数から処理が戻ってくる。 |
「char」を取得するにも関わらず、戻り値の型が「int型」になっていますね。
不思議な仕様になっていますが、実際はそれほど気にすることではありません。データ型に合わせて受け取ってあげましょう。
getchar関数のプログラム使用例
それでは、簡単なプログラムで基本的な使い方を把握しましょう。
#include <stdio.h>
int main(void)
{
int moji;
// キーボード入力待ち
moji = getchar();
// 入力された文字を表示
printf("取得した文字:%c\n", moji);
return 0;
}
このプログラムを動かすと、黒い画面が表示されユーザーからのキーボード入力待ちとなります。
「a」キーと「Enter」キーを押すと、再度プログラムが動き出します。白い部分がキーボードから入力した文字です。
a
取得した文字:a
キー入力した文字がプログラムの中で「moji」変数へ代入されたことがわかりますね。
getchar関数の特徴を紹介
getchar関数は扱う上でいくつか注意すべき特徴があるため、順に紹介しましょう!
「キー入力待ち状態」のプログラム
getchar関数を呼び出すと、プログラムが「キー入力待ち」という状態になります。
「キー入力待ち状態」とは、プログラムがキー入力されるのを待っている状態であり、プログラムがあたかも一時停止したかのように見える状態のことです。
ユーザーがキーボードから「文字+Enter」を入力することで入力が確定し、プログラム処理が再度動き出します。
つまり、入力が確定するまでは次のプログラムであるprintf関数の処理は実施されないことになります。
複数のキー入力情報はバッファリングされている
getchar関数に対して複数の文字、つまりは「文字列」をキー入力することもできます。ただし、戻り値として取得できるのは、あくまでも1文字のみです。
といっても、複数入力された文字が消えたわけではありません。
次のプログラムを動かしてみます。
#include <stdio.h>
int main(void)
{
int moji;
while (1)
{
// キーボード入力待ち
moji = getchar();
// 入力された文字を表示
printf("取得した文字:%c\n", moji);
}
return 0;
}
入力文字は次のように「ab+Enter」とすると、一文字ずつ順に表示されました。
ab
取得した文字:a
取得した文字:b
取得した文字:
キー入力は1度しか実施していませんが、ループが3回実施されたことがわかりますね。
このようにgetchar関数は、内部に文字情報をバッファリング(貯蔵)する機構があります。
バッファにデータが残っている場合は、getchar関数を再度呼び出しても「入力待ち」にならず、バッファから順に文字を取り出すことになります。
文字を入れた後に「Enter」を押すと、バッファ終端に改行文字の「\n」が格納されます。出力結果の3つ目の最後は、改行文字のため表示されてないのです。
getchar関数が戻り値で返却する「EOF」とプログラム使用例
「EOF」とは「End Of File」の略でファイルの終端であることを示す情報のことです。
実際のプログラムでは、次のように「stdin.h」にマクロ定義がされています。
#define EOF (-1)
Windows環境においては「Ctrl + z」キーによって「EOF」を作り出します。
「EOF」を検知して対話を終了するプログラムは、次のように作ります。
#include <stdio.h>
int main(void)
{
int moji;
while ((moji = getchar()) != EOF)
{
printf("取得した文字:%c\n", moji);
}
return 0;
}
「Ctrl+z」と「Enter」キーを入力すると次の白色部分になり、「EOF」を認識してプログラムを終了したことになります。
a
取得した文字:a
取得した文字:
^Z
プログラムが動くイメージは次のものです。
getchar関数はキーボードからの入力を行うため、ファイル終端を意味する「EOF」を扱うのは違和感がありますが、入力の終端として扱うのです。
getchar関数を使った対話プログラムのサンプルプログラム
getchar関数を使ってユーザーと対話するプログラムを作ってみましょう。
コマンドの割り付け定義
キーボードの任意の文字入力に対して、とある機能を割り付けていきます。例えば次のように割り付けます。
記号 | コマンドの意味 | 概要 |
---|---|---|
l,L | リストコマンド | コマンドのリストを表示する |
h,H | Helloコマンド | あいさつをする |
p,P | PIコマンド | 円周率を表示する |
その他 | 未サポート | 未サポート |
コマンドに機能を紐づけたプログラム例
プログラムは次のように作ります。switch文と相性がよく、割り付けた文字に従って実施したい処理を実施します。
#include <stdio.h>
int main(void)
{
int moji;
while ((moji = getchar()) != EOF)
{
switch (moji)
{
case '\n': // 改行は無視する
break;
case 'l': // コマンドのリストを紹介
case 'L':
printf("h : greeting\n");
printf("l : command list\n");
printf("p : pi\n");
break;
case 'h': // あいさつを表示
case 'H':
printf("Hello\n");
break;
case 'p': // πを表示
case 'P':
printf("%lf\n", 3.141592);
break;
default:
printf("no support input\n");
break;
}
}
return 0;
}
「\n」の改行は何もしないようにしておくとよいでしょう。
プログラムを動かすと入力が求められ「コマンド記号+Enter」を押します。白色部分が入力した例となります。
p
3.141592
H
Hello
L
h : greeting
l : command list
p : pi
T
no support input
^Z
このように、あたかもプログラムと対話しているようなアプリケーションを作ることができます。
このようなキー入力に応じて反応するプログラムは案外あります。実装も簡単で、様々な機能を自由に紐づけできるので便利ですね。