C言語で文字を扱うとき、まず理解しておきたいのが「1文字だけ」を読み書きする標準入力・標準出力の関数です。
特にgetcharとputcharは、動きがシンプルでありながら、多くのプログラムの土台になります。
ここでは、C言語初心者の方でもわかりやすいように、これらの関数の基本から、実際のサンプルコード、少し踏み込んだ使い方まで順を追ってていねいに解説していきます。
getcharとputcharとは
getcharとは
getcharは、標準入力(通常はキーボード)から1文字だけを読み取る関数です。
C言語では標準ライブラリ関数としてstdio.hに定義されています。
プログラムのイメージとしては、次のような動きです。
- キーボードから文字を入力する
- ユーザーがEnterキーを押す
- 入力された文字列の中から、先頭の1文字だけがgetcharの戻り値になる
大切なのは、「1文字」という単位での入出力に特化している点です。
文字列ではなく、あくまで1文字です。
putcharとは
putcharは、標準出力(通常は画面)に1文字だけを表示する関数です。
こちらもstdio.hに定義された標準ライブラリ関数です。
イメージとしては次のようになります。
- プログラムから1文字を渡す
- その文字が画面に表示される
printfとの違いは、"%d"や"%s"のような書式を使わず、「文字1つだけ」を単純に出力する点です。
getcharとputcharがC言語初心者におすすめな理由
C言語初心者にとって、getcharとputcharが特におすすめな理由はいくつかあります。
1つ目は、関数の動きがとても単純なことです。
どちらも「1文字だけ」を扱うため、文字列や配列を意識せずに、「入力して、表示する」というプログラムの基本を理解しやすくなります。
2つ目は、バッファやEOFなど、C言語の基礎的な概念に触れられることです。
たとえば、getcharではEOFという特別な値が返ってくる場合があり、これを通じて「入力の終わり」や「エラー」という概念を学ぶことができます。
3つ目は、より高度な処理の基礎になることです。
複数文字を順番に処理したり、ファイルの内容を1文字ずつ読み取ったりといった応用を学ぶとき、getcharとputcharの理解はそのまま役に立ちます。
getcharの基本的な使い方
getcharの書き方と返り値
getcharの基本的な書き方はとてもシンプルです。
#include <stdio.h>
int main(void) {
int ch; /* 読み取った文字を格納する変数(型はint) */
ch = getchar(); /* 標準入力から1文字読み取る */
return 0;
}
ここで重要なのは、戻り値の型がintであることです。
文字を扱うのでcharにしたくなりますが、C言語の標準仕様ではgetcharの戻り値はintと決められています。
その理由は、通常の文字(0〜255など)以外に、EOFという特別な値を返す必要があるからです。
EOFは多くの処理系で-1として定義されており、charでは区別がつきにくくなってしまうため、intが使われています。
表にすると次のようになります。
| 種類 | 値の例 | 説明 |
|---|---|---|
| 通常の文字 | 0〜255程度 | 実際の文字データ(charを拡張したもの) |
| EOF(入力の終わり) | -1(多くの環境) | 入力の終わりやエラーを表す特別な値 |
文字とEOFを区別するためにint型を使う点は、C言語ではとても重要です。
1文字だけ読み取るサンプルコード
ここでは、キーボードから1文字だけ読み取り、その文字のコードも一緒に表示するサンプルを示します。
初心者向けに、コメントも多めに入れています。
#include <stdio.h>
int main(void) {
int ch; /* getcharの戻り値を受け取るための変数(int型が重要) */
printf("1文字入力してからEnterキーを押してください。\n");
printf("入力待ち中です: ");
/* 標準入力から1文字読み取る */
ch = getchar();
/* 読み取った文字と、その文字コードを表示する */
printf("読み取った文字は '%c' です。\n", ch);
printf("文字コード(10進数)は %d です。\n", ch);
return 0;
}
実行例は次のようになります。
1文字入力してからEnterキーを押してください。
入力待ち中です: A
読み取った文字は 'A' です。
文字コード(10進数)は 65 です。
ここで、ユーザーはAを入力し、続けてEnterキーを押していますが、getcharが返したのは最初の1文字'A'だけです。
残りの入力(Enterを含む)は、まだ入力バッファに残っています。
Enterキーはどう扱われるか
C言語の標準入力は、多くの環境で行バッファリングという仕組みになっています。
この仕組みでは、次のように動作します。
- ユーザーがキーボードから文字を入力する
- ユーザーがEnterキーを押すまで、入力はOS側のバッファにたまる
- Enterキーが押されたタイミングで、プログラム側から読み取れるようになる
このとき、Enterキーそのものも1文字として扱われる点に注意が必要です。
たとえば、次のように入力した場合を考えます。
- 入力:
ABC+ Enter
このとき、入力バッファには次のように文字が並んでいると考えられます。
- Windowsなど:
'A' 'B' 'C' '\r' '\n' - Unix/Linux/macOS:
'A' 'B' 'C' '\n'
実際に複数回getcharを呼び出して、どのように文字が読まれるか試してみる簡単なサンプルを示します。
#include <stdio.h>
int main(void) {
int ch1, ch2, ch3;
printf("3文字入力してからEnterキーを押してください。\n");
printf("入力待ち中です: ");
ch1 = getchar(); /* 1文字目を読み取る */
ch2 = getchar(); /* 2文字目を読み取る */
ch3 = getchar(); /* 3文字目を読み取る(場合によっては改行文字) */
printf("1文字目: '%c' (コード: %d)\n", ch1, ch1);
printf("2文字目: '%c' (コード: %d)\n", ch2, ch2);
printf("3文字目: '%c' (コード: %d)\n", ch3, ch3);
return 0;
}
実行例(Unix系環境でABCと入力した場合)は次のようになります。
3文字入力してからEnterキーを押してください。
入力待ち中です: ABC
1文字目: 'A' (コード: 65)
2文字目: 'B' (コード: 66)
3文字目: 'C' (コード: 67)
この例では3回しかgetcharを呼んでいないため、改行文字'\n'はまだバッファに残っている状態です。
4回目のgetcharを呼ぶと、通常はこの'\n'が読み取られます。
Enterキーを押すと、その改行文字も「1文字」として扱われるという点を、意識しておくとよいです。
EOFとエラー時の挙動を理解する
EOF(End Of File)は、入力の終わりやエラー状態を表す特別な値です。
getcharは、次の2つの場合にEOFを返します。
- 入力の終わりに達したとき
- 入力エラーが発生したとき
EOFはstdio.hで定義されているマクロで、多くの処理系では-1という値になっていますが、具体的な値に依存せずEOFという名前で扱うのが正しい書き方です。
EOFをチェックする基本的なコードは次のようになります。
#include <stdio.h>
int main(void) {
int ch;
printf("何か文字を入力してからCtrl+D(Unix)またはCtrl+Z+Enter(Windows)でEOFを送ってください。\n");
while (1) {
ch = getchar(); /* 1文字読み取る */
if (ch == EOF) { /* EOFかどうかを確認する */
printf("EOFを検出しました。ループを終了します。\n");
break;
}
printf("読み取った文字: '%c'\n", ch);
}
return 0;
}
実行例(Unix系環境)は次のようになります。
何か文字を入力してからCtrl+D(Unix)またはCtrl+Z+Enter(Windows)でEOFを送ってください。
abc
読み取った文字: 'a'
読み取った文字: 'b'
読み取った文字: 'c'
<ここでCtrl+Dを押す>
EOFを検出しました。ループを終了します。
このように、EOFを検出することで入力の終わりを判断し、ループを終了することができます。
ファイルから入力を読む場合も、getcharがEOFを返すかどうかをチェックする書き方がよく使われます。
putcharの基本的な使い方
putcharの書き方と引数
putcharは、1文字だけを標準出力に表示する関数です。
書き方は次のとおりです。
#include <stdio.h>
int main(void) {
int ch = 'A'; /* 表示したい文字(文字リテラル) */
putchar(ch); /* 1文字だけ表示する */
return 0;
}
putcharの引数の型もintですが、実際には文字コードとして有効な範囲の値を渡すのが前提です。
戻り値としては、出力した文字が返るか、エラー時にはEOFが返りますが、初心者のうちは戻り値を使わないことが多いです。
1文字だけ表示するサンプルコード
ここでは、アルファベットの文字をいくつか表示してみる簡単な例を示します。
#include <stdio.h>
int main(void) {
int ch1 = 'X';
int ch2 = 'Y';
int ch3 = 'Z';
/* それぞれの文字を1文字ずつ表示する */
putchar(ch1);
putchar(ch2);
putchar(ch3);
/* 最後に改行も入れておくと見やすい */
putchar('\n');
return 0;
}
実行結果は次のようになります。
XYZ
ここではprintfを使わずに、putcharだけで文字列のように見えるものを表示しています。
実際には'X'、'Y'、'Z'、'\n'の4文字を、順番に1文字ずつ出力しているだけです。
改行を表示する方法
C言語では、改行は'\n'という特別な文字で表します。
putcharで改行を表示したい場合は、この'\n'を渡せばよいです。
#include <stdio.h>
int main(void) {
printf("1行目の表示です。");
putchar('\n'); /* 改行を1文字表示する */
printf("2行目の表示です。\n"); /* printfでももちろんOK */
return 0;
}
実行結果は次のようになります。
1行目の表示です。
2行目の表示です。
このように、改行も1文字として扱われるという考え方は、getcharとputcharの両方で共通しています。
getcharとputcharを組み合わせた練習
キーボードから1文字読み取り→そのまま表示するプログラム
最初の練習として、キーボードから1文字入力し、その文字をそのまま画面に出力するプログラムを作ってみます。
いわゆる「文字エコー」のような動きです。
#include <stdio.h>
int main(void) {
int ch;
printf("1文字入力してからEnterキーを押してください。\n");
printf("入力待ち中です: ");
/* 1文字読み取る */
ch = getchar();
printf("あなたが入力した文字は: ");
/* 読み取った文字をそのまま表示する */
putchar(ch);
putchar('\n'); /* 最後に改行を入れておく */
return 0;
}
実行例は次のとおりです。
1文字入力してからEnterキーを押してください。
入力待ち中です: k
あなたが入力した文字は: k
このプログラムでは、getcharで読み取った値を、そのままputcharに渡しているだけです。
とても単純ですが、入力と出力の流れがよくわかります。
複数文字を1文字ずつ読み書きするループ処理
次に、複数文字を1文字ずつ読み取り、そのまま出力するプログラムを作ってみます。
ここでは、EOFが来るまで繰り返すようにします。
これは、「標準入力から標準出力へのコピー」とも言え、簡易的なテキストコピーのような動きをします。
#include <stdio.h>
int main(void) {
int ch;
printf("文字を入力してください。(EOFで終了)\n");
printf("Unix系ではCtrl+D、WindowsではCtrl+Z+EnterがEOFです。\n\n");
/* getcharがEOFを返すまで繰り返す */
while ((ch = getchar()) != EOF) {
/* 読み取った文字をそのまま出力する */
putchar(ch);
}
printf("\nEOFを検出したので終了します。\n");
return 0;
}
実行の様子(Unix系環境の一例)は次のとおりです。
文字を入力してください。(EOFで終了)
Unix系ではCtrl+D、WindowsではCtrl+Z+EnterがEOFです。
Hello
Hello
abcd
abcd
<ここでCtrl+Dを押す>
EOFを検出したので終了します。
このプログラムが行っている処理を、順を追って整理すると次のようになります。
getchar()で1文字読み取る- EOFでないか確認する
- EOFでなければ、その文字を
putchar()で表示する - 再び1に戻る
ここで重要なのは、条件式(ch = getchar()) != EOFの書き方です。
代入と比較を1行にまとめるこの書き方は、C言語でよく用いられます。
printfとの違いと使い分け
最後に、getchar/putcharとprintfの違いについて整理し、どのように使い分ければよいかを説明します。
| 関数名 | 主な用途 | 特徴 |
|---|---|---|
| getchar | 標準入力から1文字読む | 戻り値はint、EOFを扱える |
| putchar | 標準出力に1文字書く | 引数はint、1文字だけの出力 |
| printf | 書式付きで文字列などを出力 | %d, %s などのフォーマット指定が使える |
printfは非常に便利で多機能ですが、そのぶん内部でかなり複雑な処理を行っています。
対して、getchar/putcharは「1文字だけ」をシンプルに扱うため、次のような場面で向いています。
- 文字を1つずつ処理したいとき
- ファイルや標準入力を文字単位で読みたいとき
- シンプルなエコーやコピー処理を書きたいとき
一方で、次のような場面ではprintfを使った方がよいです。
- 数値を見やすく表示したいとき(
%dなど) - 複数の値をまとめて表示したいとき
- 書式を整えた出力が必要なとき(桁合わせなど)
たとえば、次の2つのコードを比べてみると、役割の違いがわかりやすくなります。
1文字ずつ出力する例:
#include <stdio.h>
int main(void) {
putchar('H');
putchar('i');
putchar('!');
putchar('\n');
return 0;
}
書式付きでまとめて出力する例:
#include <stdio.h>
int main(void) {
printf("Hi!\n");
return 0;
}
どちらも同じ表示結果になりますが、前者は「文字を順番に扱う」練習として有用であり、後者は実務的で簡潔な書き方です。
学習の段階に応じて、両方の書き方に慣れておくとよいです。
まとめ
getcharとputcharは、C言語におけるもっとも基本的な文字入出力の関数です。
getcharは標準入力から1文字をint型として読み取り、EOFも検出できます。
putcharは標準出力に1文字を表示し、改行も'\n'という1文字として扱います。
これらを組み合わせることで、複数文字を1文字ずつ処理するループや、標準入力から標準出力へのコピーのようなプログラムが書けます。
初心者のうちに「1文字単位で処理する感覚」に慣れておくと、その後の文字列処理やファイル入出力の理解がぐっとスムーズになります。
