文字の読み取り
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フィードバックを取得できます。ローカル設定は不要です。