※ ChatGPTを利用し、要約された質問です(原文:getcharの働きについて)
getcharの働きについて
このQ&Aのポイント
getchar()関数とは、1文字ずつ入力を受け取る関数であり、入力した文字を出力するためのputchar()関数と一緒に使われることが多い。
getchar()関数を使って、入力した文字列をそのまま出力するプログラムを作成することができる。
getchar()関数には異常終了しないため、入力がなくなるまで繰り返し動作する。また、マルチバイト文字や文字列も入力として扱うことができる。
1文字入出力関数getchar()、putchar()の働きを調べるため、次のソースを作って動かしてみました。'>'を使って、実行結果をテキストファイルに出力してみました。
★ソース1(□はタブ)
◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
□int ch;
□printf("何か文字を入力して下さい。\n");
□printf("(Ctrl+Zが入力されたら終了します。)\n");
□while ((ch = getchar()) != EOF)
□□putchar(ch);
□
□return EXIT_SUCCESS;
}
◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
★実行結果
◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
何か文字を入力して下さい。
(Ctrl+Zが入力されたら終了します。)
a
abcde
◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
上のように、遊びで文字列を入力してみましたところ、1文字と同様に、入力したとおりに出力されました。そこで、入力したものを確認するために、printf()で出力する行を一つ次のように入れましたところ、次の実行結果のようになりました。
★ソース2(□はタブ)
◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
□int ch;
□printf("何か文字を入力して下さい。\n");
□printf("(Ctrl+Zが入力されたら終了します。)\n");
□while ((ch = getchar()) != EOF)
□□printf("入力は%c\n", ch);
□□putchar(ch);
□
□return EXIT_SUCCESS;
}
◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
★実行結果
◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
何か文字を入力して下さい。
(Ctrl+Zが入力されたら終了します。)
入力はa
入力は
入力はa
入力はb
入力はc
入力はd
入力はe
入力は
◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
getchar()で上のように文字列を入力した場合、異常終了にはならないのでしょうか。また、2バイト文字('あ')とか、その文字列("あいうえお")を入力して実行してみましたが、異常にはなりませんでした。getchar()に文字列を入力した場合、どのように処理されるのでしょうか。実用的ではないかもしれませんが、コンピュータの動きをちゃんと理解したいと思いますので、よろしくお願い致します。
お礼
早々にとても明快なご回答、誠にありがとうございます。よく考えてみます。 後半の部分は、"{}"をつけるのを忘れていました。まだまだケアレスミスが多いですね、見直しを徹底します。
補足
>元々複数文字読み込んでいるのです。その数が増えただけです。 読み込まれた情報は、どこに格納されるのでしょうか。putchar()を使わないでgetchar()ばかりを実行していけば、格納場所にどんどん蓄積されていくのでしょうか、それとも、上書きされていって、putchar()が実行される直前の値だけ保持されているのでしょうか。この辺りのメカニズムが分かりません。ご教授頂けないでしょうか。 それから、 >「あ」の場合も(Shift_JISの場合) >getcharで 「あ」の1バイト目 を受け取る→putcharで 「あ」の1バイト目 を出力 >getcahrで 「あ」の2バイト目を受け取る→putcharで 「あ」の2バイト目 を出力 >と2回に分けて処理されます。 2バイト文字の場合も理解ができていないのでご教授願います。コードを調べたところ、 文字 あ S-JIS 0x82A0 JIS 0x2422 UniCode 0x3042 となっていますが、「1バイト目、2バイト目」、「上位バイト(ビット)、下位バイト(ビット)」とは、どちらから数えていくのでしょうか。上の「あ」のシフトJISの場合、コードは 0x82A0 となっていますが、2進数に変換した場合、 0 0000 1 0001 2 0010 3 0011 4 0100 5 0101 6 0110 7 0111 8 1000 9 1001 A 1010 B 1011 C 1100 D 1101 E 1110 F 1111 より、 0x82A0 → (2進数)1000 0010 1010 0000 となりますが、 (16進数)(A→)82A0(←B) (2進数)(C→)1000 0010 1010 0000(←D) とした場合、16進数ではAかBか、2進数ではCかDのどちらが上位・下位、1バイト目・2バイト目になるのでしょうか。 あと、whileループに{}をつけて実行したところ、実行結果は ◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆ 何か文字を入力して下さい。 (Ctrl+Zが入力されたら終了します。) 入力はa a入力は 入力はa a入力はb b入力はc c入力はd d入力はe e入力は ◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆ となりました。