【C言語】getc・getchar・getch・getcheの違いを徹底解説!文字入力関数の使い分けまとめ
C言語には、キーボードや入力ストリームから1文字を読み取るための関数が複数用意されています。getc()、getchar()、getch()、getche()はいずれも入力から1文字を読み込み、その結果を整数値(int型)として返します。読み取りに失敗した場合や入力の終端に達した場合には、EOFが返されます。
ただし、この4つの関数は「どこから読み込むか」「標準規格に含まれるか」「入力文字を画面に表示するか(エコーバック)」「Enterキーの入力を待つか」といった点で大きく異なります。以下、順番に詳しく見ていきましょう。
getc()とは
getc()は、指定した入力ストリームから1文字を読み取り、整数値として返す標準ライブラリ関数です。読み取りに失敗した場合はEOFを返します。引数に任意のFILEポインタを渡せるため、ファイルだけでなく標準入力(stdin)なども扱えます。
C言語におけるgetc()の構文は以下のとおりです。
int getc(FILE *stream);
サンプルコード
#include <stdio.h>
int main () {
char val;
printf("文字を入力してください:\n");
val = getc(stdin);
printf("入力された文字:");
putc(val, stdout);
return 0;
}
実行結果
文字を入力してください: a 入力された文字:a
getchar()とは
getchar()も標準ライブラリ関数ですが、getc()と異なり標準入力(stdin)専用である点が特徴です。つまり、getchar()は「getc(stdin)」と同等の働きをします。
C言語におけるgetchar()の構文は以下のとおりです。
int getchar(void);
サンプルコード
#include <stdio.h>
int main () {
char val;
printf("文字を入力してください:\n");
val = getchar();
printf("入力された文字:%c\n", val);
return 0;
}
実行結果
文字を入力してください: n 入力された文字:n
getch()とは
getch()は非標準関数で、「conio.h」ヘッダーファイルで宣言されています。主にTurbo CなどのDOS系の開発環境で使われており、C標準ライブラリには含まれていません。
最大の特徴は、Enterキーの入力を待たずに、押されたキーを即座に返す点です。さらに、入力した文字は画面に表示されません(エコーバックなし)。ゲームやメニュー選択など、キー入力をリアルタイムに処理したい場合に便利です。
C言語におけるgetch()の構文は以下のとおりです。
int getch();
サンプルコード
#include <stdio.h>
#include <conio.h>
int main () {
char val;
printf("何かキーを押してください:");
val = getch();
printf("\n入力された文字:%c\n", val);
return 0;
}
実行結果
何かキーを押してください: 入力された文字:m
※ m を押しても画面には表示されず、プログラム側だけで受け取られます。
getche()とは
getche()もgetch()と同様の非標準関数で、「conio.h」ヘッダーファイルで宣言されています。キーボードから1文字を読み取り、Enterキーを待たずに即座に返します。
getch()との違いは、入力した文字が画面に表示される(エコーバックされる)点です。関数名の末尾にある「e」は「echo(エコー)」を意味しています。
C言語におけるgetche()の構文は以下のとおりです。
int getche(void);
サンプルコード
#include <stdio.h>
#include <conio.h>
int main () {
char val;
printf("何かキーを押してください:");
val = getche();
printf("\n入力された文字:%c\n", val);
return 0;
}
実行結果
何かキーを押してください:s 入力された文字:s
※ s を押すと、その場ですぐに画面へ表示されます。
4つの関数の違いを一覧で比較
| 関数名 | 規格 | ヘッダー | 入力元 | エコー表示 | Enterキー待ち |
|---|---|---|---|---|---|
| getc() | 標準 | stdio.h | 任意のストリーム | あり | 待つ |
| getchar() | 標準 | stdio.h | 標準入力のみ | あり | 待つ |
| getch() | 非標準 | conio.h | コンソール(キーボード) | なし | 待たない |
| getche() | 非標準 | conio.h | コンソール(キーボード) | あり | 待たない |
移植性に関する注意点
getc()とgetchar()はISO C規格に含まれているため、Windows・Linux・macOSなどどの環境でも問題なく使用できます。一方、getch()とgetche()はconio.hに依存しているため、主にWindows向けの古いコンパイラ(Turbo C、Borland C++など)でしか使えず、Unix系OSではそのままコンパイルできません。Linuxなどで同様の動作を実現するには、termiosを使って端末を非カノニカルモードに変更するなどの工夫が必要です。
まとめ
標準的な文字入力にはgetchar()、ファイルなど任意のストリームからの読み込みにはgetc()を使うのが基本です。Enterキーを待たずにキー入力を取得したい場合はgetch()/getche()が便利ですが、これらは非標準のため移植性が低い点に注意しましょう。用途と動作環境に応じて、適切な関数を選択することが大切です。
-
C++で解く二分木の「ノードと祖先の最大差」アルゴリズム
二分木のルートが与えられたとき、異なる2つのノードAとB(AはBの祖先)が存在し、V = |Aの値 − Bの値| となるような最大値Vを求める問題を考えてみましょう。例えば、次のような二分木が与えられた場合を考えます。この場合、出力は 7 となります。祖先と子孫のノード間の差は [(8 - 3), (7 - 3), (8 - 1), (10 - 13)] のようになり、その中で最大なのは (8 - 1) = 7 だからです。解法のアプローチこの問題を解くには、以下の手順に従います。まず、答えを格納する変数 ans を 0 で初期化します。solve() というメソッドを定義します。このメソッド
-
Python正規表現の特殊文字「.」「?」「*」の違いをわかりやすく解説
はじめにPythonの正規表現(reモジュール)では、特定の意味を持つ特殊文字がいくつか用意されています。その中でも頻繁に使われるのが「.(ドット)」「?(クエスチョンマーク)」「*(アスタリスク)」の3つです。それぞれ役割が異なるため、違いをしっかり理解しておくことが重要です。特殊文字「.」(ドット)ドットは「任意の1文字」にマッチします。デフォルトのモードでは、改行文字以外のあらゆる1文字と一致します。例えば a.c というパターンは、「abc」「a1c」「a c」などにマッチします。ただし、re.DOTALL フラグを指定した場合は、改行文字も含めたすべての文字にマッチするようになります