C言語でキーボードから1文字だけ読み取り、そのまま画面に1文字表示する方法は、学習初期に身につけておくと後の入力処理の理解がスムーズになります。
本記事では、標準ライブラリのgetchar
とputchar
を使い、1文字単位での入出力の基本、実用的なサンプル、初心者がつまずきやすい注意点やエラー例まで、丁寧に解説します。
C言語のgetcharとputcharの基本
1文字入出力とは
C言語では、標準入力(キーボード)から1文字だけを読み取る処理と、標準出力(画面)に1文字だけを表示する処理を簡潔に書けます。
これがgetchar
とputchar
です。
1回の呼び出しでちょうど1文字を扱うため、入力の様子を「目で追って」理解しやすいのが特長です。
必要なヘッダファイル(stdio.h)
これらの関数は標準入出力ライブラリstdio.h
に含まれています。
使う前に#include <stdio.h>
を必ず書きます。
書き忘れるとコンパイルエラーになるため注意が必要です。
読み書きの前提
標準入力は通常キーボード、標準出力はコンソール画面に結び付いています。
WindowsでもLinuxでも、エンターキーは改行'\n'
として読み取られると考えて問題ありません。
getcharの使い方(1文字を読む)
getchar
は「標準入力から1文字読み取り、その文字の値をint
で返す」関数です。
返り値がint
なのは、通常の文字とEOF
(読み取り不能や終端)を区別するためです。
文字を変数へ入れる場合でも、まずはint
で受けるのがおすすめです。
- プロトタイプ:
int getchar(void);
- 正常時の返り値: 読み取った文字を
unsigned char
に変換した値 - 失敗時の返り値:
EOF
使い方の基本
1回呼ぶと1文字だけ読みます。
2文字欲しければ2回呼びます。
エンターの改行'\n'
も1文字として読まれる点が重要です。
putcharの使い方(1文字を表示)
putchar
は「標準出力に1文字を書き出す」関数です。
こちらも返り値はint
で、書き込みに失敗したときEOF
が返る仕様です。
- プロトタイプ:
int putchar(int c);
- 引数: 表示したい文字を表す
unsigned char
相当の整数 - 返り値: 正常時は書き込んだ文字、失敗時は
EOF
使い方の基本
表示したい文字を引数に渡すだけです。
行末で改行したいときはputchar('\n');
を併用します。
2つの関数の要点まとめ
関数名 | プロトタイプ | 主な返り値 | 要点 |
---|---|---|---|
getchar | int getchar(void); | 取得文字またはEOF | 読み取りは1回で1文字。返り値はintで受けるのが安全。 |
putchar | int putchar(int c); | 出力文字またはEOF | 表示は1回で1文字。改行は’\n’を明示する。 |
「標準入力から1文字読む→その文字を標準出力へ1文字表示する」という最小単位のやり取りがこの2つで実現できます。
getcharとputcharの使い方(サンプル)
1文字を読み取り、そのまま表示する
最小の例です。
1文字を読み、そのまま表示します。
見やすさのため最後に改行も出力しています。
#include <stdio.h>
int main(void) {
// 1文字を読み取る。返り値はintで受けるのがポイント
int ch = getchar(); // キーボードからの入力を1文字だけ取得
if (ch != EOF) {
// 取得した1文字をそのまま表示
putchar(ch);
// 見やすくするために改行を追加
putchar('\n');
}
return 0;
}
入力: A⏎
出力:
A
Enterの改行は別の1文字'\n'
として扱われます。
上の例では、ユーザーがAを押し、その後にEnterを押しても、プログラム自体はAの1文字だけを表示し、最後にプログラム側の改行を出しています。
2文字を順に読み、順に表示する
2回getchar
を呼び、2回putchar
で表示します。
ユーザーは2文字続けて入力してからEnterを押すと意図通り動きます。
#include <stdio.h>
int main(void) {
// 2文字を続けて読み取る
int ch1 = getchar(); // 1文字目
int ch2 = getchar(); // 2文字目(Enterの直前に打った文字を想定)
// 読めていれば順に表示
if (ch1 != EOF) { putchar(ch1); }
if (ch2 != EOF) { putchar(ch2); }
// 見やすさのために改行
putchar('\n');
return 0;
}
入力: AB⏎
出力:
AB
もしユーザーがA⏎のように1文字だけ打ってEnterを押すと、2文字目は'\n'
(改行)になります。
このとき出力はA
と改行が並ぶため、結果として1行空いたように見えることがあります。
1文字入出力の注意点(初心者向け)
Enterの改行(‘\n’)も1文字として読まれる
エンターキーは'\n'
という1文字として入力バッファに入ります。
「何文字入力したか」ではなく「何回getchar
を呼んだか」で読み取れる文字数が決まることを意識してください。
スペース・タブも文字として扱われる
スペース' '
やタブ'\t'
も1文字です。
例えばgetchar
で先頭のスペースを読めば、スペースがそのまま返ります。
数値入力と違い、getchar
は空白を特別扱いしません。
改行を捨てたいときはgetcharで1文字読み捨てる
「1文字だけを処理し、最後に押されたEnter(改行)は無視したい」という場面はよくあります。
もっとも単純な形は次のとおりです。
ユーザーが1文字だけ入力してすぐEnterを押す前提なら、getchar
をもう1回呼ぶだけで改行を捨てられます。
#include <stdio.h>
int main(void) {
int ch = getchar(); // ユーザーの1文字
int nl = getchar(); // 2回目で改行( '\n' )を読み捨てる想定
if (ch != EOF) {
putchar(ch);
putchar('\n');
}
return 0;
}
より堅牢に「その行の残りを全部捨てる」なら、改行が来るまで読み捨てるループにします。
これなら、誤って複数文字をタイプしても影響を最小化できます。
#include <stdio.h>
int main(void) {
int ch = getchar(); // 処理対象の1文字
// 入力行の残りを改行まで読み捨てる
int c;
while ((c = getchar()) != '\n' && c != EOF) {
// 何もしない(捨てるだけ)
}
if (ch != EOF) {
putchar(ch);
putchar('\n');
}
return 0;
}
日本語(全角)は扱わない前提で練習する
日本語(全角文字)は多くの環境で複数バイトの並びで表現されます。
getchar
は「1バイト」ずつ読むため、全角1文字を正しく1回で読み取れないことがあります。
初学段階ではASCIIの英数字や記号のみを対象に練習すると混乱を避けられます。
よくあるエラーと対処(getchar, putchar)
セミコロンの付け忘れ
Cでは各文の末尾に;
が必要です。
付け忘れるとコンパイルエラーになります。
エラーになりがちな例:
#include <stdio.h>
int main(void) {
int ch = getchar() // ← セミコロンがない
putchar(ch);
return 0;
}
典型的なエラー表示例:
error: expected ';' before 'putchar'
修正後:
#include <stdio.h>
int main(void) {
int ch = getchar(); // セミコロンを付ける
putchar(ch);
return 0;
}
文字リテラルは単引用符(‘a’)を使う
文字は'a'
のように単引用符、文字列は"a"
のように二重引用符です。
putchar
に"a"
を渡すと型が合わずに警告やエラーの原因になります。
誤りの例:
#include <stdio.h>
int main(void) {
putchar("a"); // 誤り: "a" は文字列(ポインタ)で、1文字ではない
return 0;
}
修正後:
#include <stdio.h>
int main(void) {
putchar('a'); // 正しい: 'a' は1文字の文字リテラル
putchar('\n');
return 0;
}
#include<stdio.h>の書き忘れ
ヘッダを忘れると、コンパイラは関数宣言を知らないためエラーや警告を出します。
最近のコンパイラでは「暗黙の宣言」はエラー扱いです。
誤りの例:
// #include <stdio.h> がない
int main(void) {
int ch = getchar(); // 宣言を知らないためエラー
putchar(ch);
return 0;
}
典型的なエラー表示例:
error: implicit declaration of function 'getchar' is invalid in C99
修正後:
#include <stdio.h>
int main(void) {
int ch = getchar(); // OK
putchar(ch);
return 0;
}
getchar
の返り値はint
なので、EOF判定をしたい場合はchar
ではなくint
で受け取ると安全です。
まとめ
getcharとputcharは、C言語における1文字単位の入出力を学ぶ最良の入り口です。
必要なのは#include <stdio.h>
だけで、getchar
を呼べば1文字取得、putchar
を呼べば1文字表示という明快な動作を確認できます。
実践では、Enterの改行'\n'
やスペース・タブも1文字であること、必要に応じて改行をgetchar
で読み捨てること、日本語の全角は対象外で練習することを意識するとつまずきにくくなります。
最後に、;
の付け忘れ、'a'
と"a"
の混同、#include <stdio.h>
の書き忘れといった初歩的なミスを丁寧に潰しながら、サンプルを自分の手で動かして動作を確かめてみてください。