0Pricing
C Academy · レッスン

文字の読み取り

getchar と putchar です。

「文字の読み取り」はCoddyKit上の無料C Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C Academyコースには全4レッスンが含まれています。

1文字ずつ読み取る

C には、標準入力から一度に 1 文字ずつ読み取る getchar() と、標準出力へ 1 文字を書き込む putchar() が用意されています。

どちらも <stdio.h> に含まれています。

#include <stdio.h>

int main(void) {
    putchar('H');
    putchar('i');
    putchar('\n');
    return 0;
}

putchar の基本

putchar(c) は文字 c を書き込み、書き込んだ文字を返します。エラーが発生した場合は EOF を返します。

1 バイトを出力する最も簡単な方法です。

#include <stdio.h>

int main(void) {
    for (char c = 'A'; c <= 'E'; c++) {
        putchar(c);
    }
    putchar('\n');
    return 0;
}

getchar は int を返す

getchar() は char ではなく int を返します。これは、実際のどの文字とも異なる値である EOF も返せる必要があるためです。

戻り値は必ず int に格納してください。

#include <stdio.h>

int main(void) {
    int c = 'A';
    printf("Stored value: %d\n", c);
    return 0;
}

EOF とは

EOF は End Of File(ファイルの終端)を意味します。getchar() は、入力がこれ以上ないときにこれを返します。

通常は -1 の値であるため、getchar は int を使い、バイト 255 と区別できるようにしています。

#include <stdio.h>

int main(void) {
    printf("EOF has value %d\n", EOF);
    return 0;
}

読み取りループのパターン

典型的なパターンでは、EOF になるまで文字を読み取ります。ここでは対話的な入力がないためループはすぐに終了しますが、これが標準的な形です。

  • 条件式の中で代入します。
  • EOF と比較します。
#include <stdio.h>

int main(void) {
    int c;
    while ((c = getchar()) != EOF) {
        putchar(c);
    }
    printf("Reached end of input\n");
    return 0;
}

文字数を数える

よくある処理に、読み取った文字数を数える処理があります。読み取りループの中でカウンターを増やします。

#include <stdio.h>

int main(void) {
    int c;
    long count = 0;
    while ((c = getchar()) != EOF) {
        count++;
    }
    printf("Read %ld characters\n", count);
    return 0;
}

大文字にしてエコーする

書き込む前に各文字を変換できます。ここでは、読み取ったすべての文字を toupper で大文字に変換します。

#include <stdio.h>
#include <ctype.h>

int main(void) {
    int c;
    while ((c = getchar()) != EOF) {
        putchar(toupper(c));
    }
    return 0;
}

行数を数える

改行文字の個数を数えると、読み取った行数が分かります。各文字が '\n' と一致するかをテストします。

#include <stdio.h>

int main(void) {
    int c;
    int lines = 0;
    while ((c = getchar()) != EOF) {
        if (c == '\n') lines++;
    }
    printf("Lines: %d\n", lines);
    return 0;
}

文字を入力ストリームに戻す

ungetc(c, stdin) は、1 文字を入力ストリームに戻します。これにより、次の読み取りでその文字がもう一度返されます。

スキャン中に 1 文字多く読み取ってしまった場合に便利です。

#include <stdio.h>

int main(void) {
    ungetc('X', stdin);
    int c = getchar();
    printf("Got back: %c\n", c);
    return 0;
}

getchar と scanf の比較

getchar はバイトレベルで細かく制御できる一方、scanf は書式付き入力を解析します。

フィルターやトークナイザーなど、文字単位で処理する場合は getchar が適しています。

#include <stdio.h>

int main(void) {
    int c = '5';
    if (c >= '0' && c <= '9') {
        printf("It is a digit: %c\n", c);
    }
    return 0;
}

シンプルなフィルターのひな形

フィルターは入力を読み取り、変換して、出力へ書き込みます。このひな形では、入力ストリームからすべてのスペースを取り除きます。

#include <stdio.h>

int main(void) {
    int c;
    while ((c = getchar()) != EOF) {
        if (c != ' ') {
            putchar(c);
        }
    }
    return 0;
}

確認問題

文字の読み取り方法を理解できているか確認しましょう。

まとめ

文字の読み書きについて、次のことを学びました。

  • getchar() は 1 文字を読み取り、int を返します。
  • putchar(c) は 1 文字を書き込みます。
  • EOF は入力の終端を示します。while ((c = getchar()) != EOF) ループを使用します。
  • ungetc を使うと、文字をストリームに戻せます。

よくある質問

「文字の読み取り」レッスンは無料ですか?

はい。「文字の読み取り」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C Academyコースには全4レッスンが含まれています。

「文字の読み取り」で何を学びますか?

getchar と putchar です。 ブラウザで直接実行するハンズオンコードでC Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

C Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのC Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「文字の読み取り」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このC Academyレッスンでコードを書いて実行できますか?

はい。すべてのC Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 整数としての文字
  2. ctype ライブラリ
  3. 文字の読み取り
  4. 文字ユーティリティの作成
← C Academyに戻る