閉じる

C言語のgetchar・putchar入門|文字入力から出力まで一気に理解

キーボードから1文字ずつ入力を受け取り、それを画面に出力する処理は、C言語における文字入出力の基本です。

その中心となるのがgetchar関数putchar関数です。

本記事では、これら2つの関数の基本的な使い方から、EOFの扱い方、簡単な文字処理のサンプルまで、図解を交えながら丁寧に解説していきます。

getcharとputcharとは

C言語のgetcharとputcharの基本

getcharとputcharは、標準入力と標準出力を扱う、非常にシンプルな文字入出力関数です。

getcharは、標準入力(stdin)から1文字だけ読み取る関数です。

通常はキーボード入力が標準入力に接続されています。

一方、putcharは、標準出力(stdout)に1文字だけ書き出す関数です。

通常は画面に文字が表示されます。

どちらも#include <stdio.h>を行うことで利用でき、C言語の標準ライブラリに含まれています。

代表的な特徴を表にまとめます。

関数名役割入出力先単位
getchar1文字を読み込む標準入力(stdin)文字単位
putchar1文字を画面に出力する標準出力(stdout)文字単位

文字入出力でgetchar・putcharを使うメリット

「1文字ずつ」というシンプルさが、getchar・putcharの最大のメリットです。

scanf/printfに比べると機能は少ないですが、次のような利点があります。

文章で整理すると、以下のように言えます。

まず、getchar・putcharはフォーマット指定が不要で、整数や浮動小数点数のような複雑な変換を行いません。

そのため、動作が理解しやすく、バグも起こりにくいという利点があります。

また、1文字ずつ処理するため、文字列の解析簡単なエディタ機能文字ごとの変換処理(大文字・小文字の変換など)にとても向いています。

さらに、標準入力からのデータをEOFまで読み続ける処理も書きやすく、後述するwhile ((c = getchar()) != EOF)という定番パターンが使えます。

getcharの使い方

getcharの基本構文と戻り値

getcharは引数を取らず、戻り値として「読み取られた文字」を返す関数です。

基本的な書式は次のようになります。

C言語
#include <stdio.h>

int main(void) {
    int ch;   /* 戻り値を受け取る変数はint型にする */

    ch = getchar();  /* 標準入力から1文字読み込む */

    /* 読み込んだ文字を確認のために出力する */
    putchar(ch);
    putchar('\n');

    return 0;
}

このとき、戻り値の型はint型である点が重要です。

なぜ文字を読むのにint型なのかというと、EOFなどの特別な値を区別する必要があるためです。

通常の文字はunsigned char相当の値に収まりますが、EOFはそれとは別の負の値として表現されます。

そのため、char型ではなくint型で受け取るのが正しい使い方です。

EOFとgetcharの関係と注意点

EOF(End Of File)は、入力の終わりを表す特別な値です。

getcharは次の2つの場合にEOFを返します。

  1. 入力ストリームの終端に到達したとき(ファイル入力など)
  2. 入力エラーが発生したとき

このEOFもint型の定数であり、文字コードには含まれない負の値として定義されているのが一般的です。

したがって、getcharの戻り値をcharで受け取ってしまうと、EOFを文字と区別できなくなります。

EOFとの比較は、次のように行います。

C言語
#include <stdio.h>

int main(void) {
    int ch;

    ch = getchar();

    if (ch == EOF) {  /* EOFとの比較 */
        /* 入力が終わった、またはエラー */
        printf("EOF or error detected.\n");
    } else {
        printf("You entered: ");
        putchar(ch);
        putchar('\n');
    }

    return 0;
}

ファイルから読み取る場合だけでなく、標準入力でもEOFを送ることができます。

多くの環境では、次の操作でEOFを入力できます。

OS/環境EOF入力の例
Windows端末Ctrl + Z を押してから Enter
Linux/macOS端末Ctrl + D を押す

これらの操作により、ターミナルからEOFが発生し、getcharがEOFを返すようになります。

文字入力を1文字ずつ読むサンプルコード

次に、ユーザーから1文字だけ入力を受け取り、その文字を表示するサンプルを示します。

C言語
#include <stdio.h>

int main(void) {
    int ch;  /* getcharの戻り値を受け取る変数はint型 */

    printf("1文字入力してください: ");
    ch = getchar();   /* キーボードから1文字読み込む */

    printf("入力された文字は: ");
    putchar(ch);      /* 読み込んだ文字をそのまま出力する */
    putchar('\n');    /* 見やすいように改行を出力 */

    return 0;
}

想定される実行例:

1文字入力してください: A
入力された文字は: A

このプログラムでは、ユーザーが1文字入力してEnterを押したタイミングで、getcharが文字を読み込みます。

実際には、OSが行単位で入力をバッファリングしており、ユーザーがEnterを押すまでプログラムに文字が渡されないことも理解しておくとよいです。

while文で複数文字を読み取るパターン

C言語の教科書などで頻出するのが、次のEOFまで繰り返し文字を読み続けるパターンです。

C言語
#include <stdio.h>

int main(void) {
    int ch;

    /* EOFに達するまで1文字ずつ読み取って表示する */
    while ((ch = getchar()) != EOF) {
        putchar(ch);  /* 読み取った文字をそのまま出力する */
    }

    return 0;
}

出力例(ユーザー入力例):

(ユーザー入力)
Hello
World
(ここでEOFを送信)

(画面には)
Hello
World

このプログラムでは、次のような流れで動作します。

まず、getchar()が1文字読み取り、その結果がchに代入されます。

その値がEOFと異なる限り、while文の本体でputchar(ch)が実行され、読んだ文字がそのまま画面に出力されます。

EOFに達したときだけ条件式が偽になり、ループを抜けてプログラムが終了します。

「(ch = getchar()) != EOF」という書き方はC言語特有ですが、入力処理の定番パターンなので慣れておくととても役に立ちます。

putcharの使い方

putcharの基本構文と戻り値

putcharは、指定した1文字を標準出力に書き出す関数です。

基本的な書式は次の通りです。

C言語
#include <stdio.h>

int main(void) {
    int result;

    result = putchar('A');  /* 画面に'A'を1文字だけ出力する */

    /* 戻り値の確認 */
    if (result == EOF) {
        printf("\n出力エラーが発生しました。\n");
    } else {
        printf("\n出力に成功しました。\n");
    }

    return 0;
}

putcharの引数はint型ですが、実際にはその下位8ビット(またはunsigned char相当)が1文字として出力されます。

戻り値は、成功時には出力した文字失敗時にはEOFです。

しかし、標準出力が画面の場合、エラーは滅多に起きないため、戻り値を無視する例も多く見られます。

文字コードとputcharの関係

C言語では、文字は整数値(文字コード)として扱われます。

たとえばASCIIコードでは、次のような対応があります。

文字コード(10進)
‘A’65
‘B’66
‘a’97
‘0’48

putcharは、この整数値を受け取り、その値に対応する文字を出力します。

したがって、次の2つの書き方は実質的に同じ意味になります。

C言語
putchar('A');   /* 文字として指定 */
putchar(65);    /* 'A'の文字コード(ASCII)を整数で指定 */

ただし、可読性の観点からは、基本的には文字リテラル(‘A’など)を使う方が望ましいです。

制御文字(改行'\n'など)も同様に整数値として扱われていますが、エスケープシーケンスで記述する方が分かりやすい場面が多いです。

1文字ずつ出力するサンプルコード

putcharを使えば、文字列も1文字ずつ順番に出力することができます。

次のサンプルでは、配列に格納した文字列を1文字ずつputcharで表示しています。

C言語
#include <stdio.h>

int main(void) {
    char str[] = "Hello";  /* 文字列リテラルから初期化 */
    int i = 0;

    /* 文字列の終端('\0')まで1文字ずつ出力する */
    while (str[i] != '\0') {
        putchar(str[i]);  /* i番目の文字を出力 */
        i++;
    }

    putchar('\n');  /* 最後に改行を入れて見やすくする */

    return 0;
}
実行結果
Hello

このように、putcharは「配列の要素を1つずつ出力する」という使い方と相性が良く、後述のgetcharとの組み合わせでも同じパターンがよく登場します。

getcharとputcharの組み合わせ活用

入力をそのまま出力するエコープログラム

getcharとputcharを組み合わせると、入力された文字をそのまま出力する「エコー」プログラムが簡単に作れます。

これは、ターミナルの標準的な動作を自前で再現したものと考えることができます。

C言語
#include <stdio.h>

int main(void) {
    int ch;

    printf("テキストを入力してください。(EOFで終了)\n");

    /* EOFまで入力を読み取り、そのまま出力する */
    while ((ch = getchar()) != EOF) {
        putchar(ch);  /* 読んだ文字をそのまま出力 */
    }

    printf("\n入力を終了しました。\n");

    return 0;
}

実行例(ユーザー操作を含むイメージ):

テキストを入力してください。(EOFで終了)
Hello
World
(ここでEOFを入力)

Hello
World

入力を終了しました。

このようなプログラムは、一見単純に見えますが、ストリームからの入力処理の基本形であり、ファイルからの入力でもほぼ同じ構造で書くことができます。

大文字・小文字変換などの簡単な文字処理

getcharとputcharを使えば、読み取った文字を加工してから出力する処理も簡単に書けます。

ここでは、入力された英字をすべて小文字に変換して出力するサンプルを示します。

C言語
#include <stdio.h>

int main(void) {
    int ch;

    printf("英字を入力してください。(EOFで終了)\n");

    while ((ch = getchar()) != EOF) {
        /* 'A'~'Z'の範囲なら小文字に変換する */
        if (ch >= 'A' && ch <= 'Z') {
            ch = ch + ('a' - 'A');  /* 大文字→小文字への変換 */
        }

        putchar(ch);  /* 変換後の文字を出力する */
    }

    printf("\n変換を終了しました。\n");

    return 0;
}
実行結果
英字を入力してください。(EOFで終了)
Hello C LANGUAGE
^Z (← Windowsの例、EOF入力)

hello c language
変換を終了しました。

ここで行っているのは、ASCIIコード表で大文字と小文字の差が常に一定であることを利用した変換です。

より可搬性を高めるにはtolower関数(ヘッダ<ctype.h>)を使う方法もありますが、getchar・putcharの理解という観点では、あえて自前で変換してみると文字コードへの理解が深まります。

バッファと改行入力の扱い方

getchar・putcharを扱う際に混乱しやすいのが、行バッファリング改行文字の扱いです。

多くの環境では、キーボードからの標準入力は行バッファリングされています。

これは、ユーザーが文字をタイプしている間はOS側のバッファに溜めておき、Enterキーが押されたタイミングで、その行全体をプログラムに渡すという仕組みです。

たとえば、ユーザーがABCと入力してEnterを押した場合、実際には次の4文字が入力バッファに存在します。

  • ‘A’
  • ‘B’
  • ‘C’
  • ‘\n'(改行文字)

getcharを4回呼び出すと、これらの文字が順番に返されます。

つまり、次のようなコードでは、改行文字も1文字として読み取られることになります。

C言語
#include <stdio.h>

int main(void) {
    int ch;

    printf("文字列を入力してください: ");

    /* 4文字読み取って、それぞれのコード値を表示 */
    for (int i = 0; i < 4; i++) {
        ch = getchar();
        printf("読み取った文字: '%c' コード: %d\n", ch, ch);
    }

    return 0;
}

実行例(ユーザーが「ABC」+ Enterを入力した場合の一例):

文字列を入力してください: ABC
読み取った文字: 'A' コード: 65
読み取った文字: 'B' コード: 66
読み取った文字: 'C' コード: 67
読み取った文字: '
' コード: 10

ここで注目すべき点は、改行キーを押すと'\n'が1文字として入力されるということです。

Windows環境では内部的に"\r\n"が使われますが、Cの標準ライブラリを通すと'\n'1文字に変換されることが多いです。

この性質のため、「行単位で処理したいのか」「改行も含めて文字単位で処理したいのか」を意識して、プログラムを書くことが重要になります。

たとえば、行ごとに処理したい場合は'\n'が来たら処理を区切る、といった工夫が必要です。

まとめ

getcharとputcharは、C言語における最も基本的な文字入出力関数です。

getcharは標準入力から1文字をint型として読み取り、EOFとの比較で入力の終わりを検出します。

putcharは指定した1文字を標準出力に書き出す関数で、文字コードと密接な関係があります。

両者を組み合わせることで、エコープログラムや大文字・小文字変換など、シンプルながら強力な文字処理が実現できます。

まずはEOFまで読み続ける定番ループwhile ((c = getchar()) != EOF)に慣れ、改行やバッファの挙動も意識しながら、実際に手を動かして試してみてください。

クラウドSSLサイトシールは安心の証です。

URLをコピーしました!