
C言語で文字の入力と出力を行うには、scanf()やprintf()がよく使われるが、それよりも単純な方法としてgetchar()とputchar()がある。これらは、それぞれ1文字の入力と1文字の出力を行う標準ライブラリ関数であり、C言語の学習初期に扱うのに適している。
getchar()とputchar()
putchar は「文字を出す」あるいは「文字を置く」という意味になる。文字を画面や出力先に送る関数だ。
getchar()は、キーボードからの入力を1文字だけ読み込む関数で、ユーザーがキーを押し、Enterキーを押下した後に初めてその入力が処理される。「A」と入力してEnterを押すと、getchar()は「A」の文字コードを返す。一方で、入力時に発生する「改行」(Enterキー)も内部的には\nとして入力バッファに残り、後続のgetchar()がこれを読み取る点に注意が必要だ。
getchar は「文字を取る」「文字を受け取る」関数、すなわち入力から1文字を読み取る関数を指す。
putchar()は、指定した1文字を画面に出力する関数で、引数に文字(文字コード)を指定する。たとえば、putchar(‘A’);と書くと、画面に「A」が表示される。printf(“%c”, ‘A’);と似ているが、出力対象が文字に限定される分、よりシンプルで扱いやすい。
これらの関数は、C言語の標準入出力のしくみを理解する上で非常に重要であり、入出力バッファの動作や改行コードの扱いを学ぶ上でも有効である。ループや条件分岐と組み合わせて簡単な入出力処理を試すとき、getchar()とputchar()を使うと、コードの可読性が高くなるだけでなく、動作の流れも把握しやすい。
C言語における文字単位のI/O操作の基礎を身につけるのに最適な関数である。単純で直感的なため、初心者だけでなく、I/O処理を細かく制御したい場面でも活用されている。
getchar()での入力処理と改行の罠
getchar()を使った文字入力では、Enterキーによって発生する改行文字(\n)の扱いに注意が必要である。C言語では、getchar()は標準入力から1文字ずつ取り出して返す。
このとき、ユーザーがキーボードで入力しEnterを押すと、実際には複数の文字が入力バッファに格納される。たとえば、「A」と入力してEnterを押した場合、バッファには「A」と改行「\n」の2文字が残る。最初のgetchar()は「A」を読み込むが、次のgetchar()は、続いてバッファに残った「\n」を読み込む。
この仕様により、getchar()を2回続けて使うと、2文字目に期待した入力の代わりに改行が読み込まれてしまうという混乱が起こる。意図せず「何も入力していないのに処理が進んだ」「変な文字が読み込まれた」と感じる現象の多くは、実はこの改行文字の存在によるものだ。
この問題を回避する方法は、余分なgetchar()を1回追加で呼び出して、バッファに残った改行文字を読み捨てることである。以下にその具体例を示す。
#include <stdio.h>
int main(void) {
char ch1, ch2;
printf("1文字目を入力してください: ");
ch1 = getchar(); // 実際の入力(例: 'A')
getchar(); // 改行文字(\n)を読み捨てる
printf("2文字目を入力してください: ");
ch2 = getchar(); // 期待どおりに新しい入力を受け取る
printf("入力された文字は: %c と %c です\n", ch1, ch2);
return 0;
}この例では、最初のgetchar()で1文字を読み込んだあと、次のgetchar()で改行を読み捨てることで、2文字目の入力時に正しく新たな文字を受け取れるようにしている。
標準入力バッファの仕組みを理解しないままgetchar()を繰り返すと、入力のタイミングや内容に齟齬が生じるため、改行処理を明示的に管理することが重要である。
文字列 “hello world” を1文字ずつ順に出力
以下のコードは、文字列 “hello world” を1文字ずつ順に出力する例だ。strlen()で文字列の長さを取得し、for文で各文字を取り出してputchar()に渡す。これにより、文字列全体を1文字単位で画面に表示する。
#include <stdio.h>
#include <string.h>
int main(void)
{
int i;
char msg[] = "hello world";
int len = strlen(msg); // 文字列の長さを事前に取得
for (i = 0; i < len; i++)
{
putchar(msg[i]); // 1文字ずつ出力
}
putchar('\n'); // 出力後に改行
return 0;
}出力
hello worldコードの解説
char msg[] = "hello world";ここでは、msg という名前の文字配列に「hello world」という文字列を入れている。文字列は「文字の並び」で、ここではスペースも1文字として数える。
int len = strlen(msg);strlen() は文字列の長さを調べる関数だ。今回なら「hello world」は11文字なので、len に11が代入される。文字列の最後にある終端記号(ヌル文字)は数えない。
for (i = 0; i < len; i++)
ここからループ(繰り返し)が始まる。i を0から始め、len(11)まで1ずつ増やしながら繰り返す。
putchar(msg[i]);msg[i] は文字配列の中のi番目の文字を指す。putchar() はその1文字を画面に表示する関数だ。つまり、msg[0] なら ‘h’、msg[1] なら ‘e’、… という具合に1文字ずつ順に出力している。
putchar('\n');ループが終わった後に改行コード(\n)を出力し、文字の表示が終わったことを知らせている。
putchar()を使った出力の基本と活用例
putchar()は、C言語で1文字を出力するための標準関数である。引数に渡した文字を標準出力、つまり通常は画面に表示する。文法は単純で、たとえばputchar(‘A’);と書けば、画面に「A」が表示される。printf()のような書式指定は使えないが、その分動作が軽く、シンプルな文字出力に向いている。
この関数は、getchar()と組み合わせて使う場面が多い。たとえば、キーボードから1文字を入力し、そのまま画面に出力するプログラムは次のように書ける。
#include <stdio.h>
int main(void) {
char ch;
printf("1文字入力してください: ");
ch = getchar(); // 入力を取得
printf("入力された文字は: ");
putchar(ch); // 入力文字を出力
putchar('\n'); // 改行を出力
return 0;
}1文字入力してください: t
入力された文字は: tこの例では、getchar()で読み取った文字を、putchar()でそのまま表示している。出力後の改行もputchar(‘\n’);で明示的に行っている点に注目したい。文字単位の制御が必要な場面では、putchar()は直感的で強力な手段となる。
高速な文字入力が可能なgetch()とは
getch()は、Enterキーを押さずに即座に1文字を取得できる非標準関数である。標準Cライブラリには含まれておらず、多くの場合はWindows環境のconio.hで定義されている。getchar()と異なり、キーボード入力があれば即座に戻り値として返すため、バッファリングを伴わない高速な反応が特徴である。
このため、たとえばメニュー選択やゲームのキー操作など、待ち時間をなくしてインタラクティブに動作させたい処理に向いている。以下はLinux・macOSの使用例である。
#include <stdio.h>
#include <termios.h>
#include <unistd.h>
char getch() {
struct termios oldt, newt;
char c;
// 現在の端末設定を取得
tcgetattr(STDIN_FILENO, &oldt);
newt = oldt;
// カノニカルモードとエコーを無効にする
newt.c_lflag &= ~(ICANON | ECHO);
tcsetattr(STDIN_FILENO, TCSANOW, &newt);
// 1文字読み込み
c = getchar();
// 元の設定に戻す
tcsetattr(STDIN_FILENO, TCSANOW, &oldt);
return c;
}
int main() {
char c;
printf("何かキーを押してください...\n");
c = getch();
printf("\n押されたキー: %c\n", c);
return 0;
}Windows用のコード
#include <stdio.h>
#include <conio.h>
int main() {
char c;
printf("何かキーを押してください...\n");
c = getch(); // キー入力を待つ(エコーなし)
printf("\n押されたキー: %c\n", c);
return 0;
}何かキーを押してください...
押されたキー: iこのプログラムでは、ユーザーがキーを押すと即時に読み取られ、Enterを押さずに画面に表示される。ただし、getch()は入力内容を画面に表示しないという特徴もあるため、確認表示が必要な場合は別な出力処理が必要となる。
Backspaceキーなどの特殊な文字の扱いが制限されるというデメリットもある。標準関数ではないため、移植性にも注意が必要である。用途に応じてgetchar()との使い分けが求められる。
getchar()とgetch()の使い分け:実用的な入力処理の例
ユーザーに2文字のイニシャル(例:T.M)を入力させる場面では、getchar()とgetch()のどちらを使うかによって、入力の流れや操作感に明確な違いが生まれる。以下に、それぞれの関数を用いた具体的な例とその違いを示す。
まず、getchar()を使った場合は以下のようになる。
#include <stdio.h>
#include <termios.h>
#include <unistd.h>
char getch() {
struct termios oldt, newt;
char c;
// 現在の端末設定を取得
tcgetattr(STDIN_FILENO, &oldt);
newt = oldt;
// カノニカルモードとエコーを無効にする
newt.c_lflag &= ~(ICANON | ECHO);
tcsetattr(STDIN_FILENO, TCSANOW, &newt);
// 1文字読み込み
c = getchar();
// 元の設定に戻す
tcsetattr(STDIN_FILENO, TCSANOW, &oldt);
return c;
}
int main(void) {
char first, second;
printf("イニシャルを入力してください(例: T.M):");
first = getchar(); // 1文字目
getchar(); // ドットまたは区切り文字を読み飛ばす
second = getchar(); // 2文字目
printf("あなたのイニシャルは:%c.%c\n", first, second);
return 0;
}イニシャルを入力してください(例: T.M):R.U
あなたのイニシャルは:R.Uこの方法では、Enterキーを押して改行されるまで処理が進まない。したがって、ユーザーにとっては「R.U[Enter]」のように一連の入力をまとめて行う必要がある。また、バッファ内のドットや改行文字を考慮して調整する必要があり、初心者には扱いづらく感じられるかもしれない。
一方、getch()を使えば、各キー入力のたびに即時反応させることが可能になる。
#include <conio.h>
#include <stdio.h>
int main(void) {
char first, second;
printf("1文字目を入力してください:");
first = getch(); // 入力後すぐ取得
putchar(first); // 入力確認のため表示
printf("\n2文字目を入力してください:");
second = getch();
putchar(second);
printf("\nあなたのイニシャルは:%c.%c\n", first, second);
return 0;
}#include <stdio.h>
#include <termios.h>
#include <unistd.h>
char getch() {
struct termios oldt, newt;
char c;
// 現在の端末設定を取得
tcgetattr(STDIN_FILENO, &oldt);
newt = oldt;
// カノニカルモードとエコーを無効にする
newt.c_lflag &= ~(ICANON | ECHO);
tcsetattr(STDIN_FILENO, TCSANOW, &newt);
// 1文字読み込み
c = getchar();
// 元の設定に戻す
tcsetattr(STDIN_FILENO, TCSANOW, &oldt);
return c;
}
int main(void) {
char first, second;
printf("イニシャルを入力してください(例: T.M):");
first = getchar(); // 1文字目
getchar(); // ドットまたは区切り文字を読み飛ばす
second = getchar(); // 2文字目
printf("あなたのイニシャルは:%c.%c\n", first, second);
return 0;
}イニシャルを入力してください(例: T.M):I
K
あなたのイニシャルは:I.Kこの例では、ユーザーは「T」「M」Enterと順にキーを押すだけで、リアルタイムに反応する入力体験が得られる。反面、getch()は特殊キーやBackspaceに弱く、ユーザーが入力を訂正できないという制限がある。
このように、正確な入力が求められるときはgetchar()、テンポの良いインタラクションを重視する場面ではgetch()を選ぶとよい。用途に応じて最適な関数を選択して使いやすく堅牢なプログラムにしていこう。
入力の制御はプログラム品質の第一歩
C言語での文字入力処理は、ユーザーの操作感を左右する重要な要素である。getchar()やgetch()といった基本関数の動作を正しい理解に加えて「改行の扱い」や「バッファの状態」といった周辺知識も必要だ。
getch()のように即時入力が求められる場面では、その反応性の高さを活かしながらも、制限事項を考慮した設計が求められる。「入力を制御する」意識を持つことが、安定したアプリケーションの基礎を築く鍵になる。




