Cプログラミング
 Computer >> コンピューター >  >> プログラミング >> Cプログラミング

【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()が便利ですが、これらは非標準のため移植性が低い点に注意しましょう。用途と動作環境に応じて、適切な関数を選択することが大切です。

  1. 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() というメソッドを定義します。このメソッド

  2. Python正規表現の特殊文字「.」「?」「*」の違いをわかりやすく解説

    はじめにPythonの正規表現(reモジュール)では、特定の意味を持つ特殊文字がいくつか用意されています。その中でも頻繁に使われるのが「.(ドット)」「?(クエスチョンマーク)」「*(アスタリスク)」の3つです。それぞれ役割が異なるため、違いをしっかり理解しておくことが重要です。特殊文字「.」(ドット)ドットは「任意の1文字」にマッチします。デフォルトのモードでは、改行文字以外のあらゆる1文字と一致します。例えば a.c というパターンは、「abc」「a1c」「a c」などにマッチします。ただし、re.DOTALL フラグを指定した場合は、改行文字も含めたすべての文字にマッチするようになります