52

K&Rで言及されているを使用するプログラムに混乱していますgetchar()。入力文字列と同じ出力が得られます。

#include <stdio.h>

main(){
    int c;
    c = getchar();
    while(c != EOF){
         putchar(c);
         c = getchar();
    }
}

なぜ文字列全体を印刷するのですか?文字を読み取って、もう一度入力を求めることを期待します。

また、入力するすべての文字列はEOFで終了しますか?

4

5 に答える 5

42

使用する可能性のある単純なセットアップではgetcharバッファリングされた入力で機能するため、getcharが何かを読み取る前にEnterキーを押す必要があります。EOF文字列は;で終了しません。実際、これは実際にEOFは文字ではなく、ファイルの終わりを示す魔法の値です。ただしEOF、読み取られた文字列の一部ではありません。getchar読むべきものが何も残っていないときに戻るものです。

于 2010-09-09T13:13:58.887 に答える
32

getchar()と友人が読み取る基礎となるバッファ/ストリームがあります。テキストを入力すると、テキストはどこかのバッファに保存されます。getchar()一度に1文字ずつストリーミングできます。読み取るたびに、バッファの最後に到達するまで次の文字が返されます。後続の文字を要求しない理由は、バッファから次の文字をフェッチできるためです。

スクリプトを実行して直接入力すると、CTRL+ D(ファイルの終わり)を押すまで入力を求めるプロンプトが表示され続けます。データを含むテキストファイルが./program < myInputどこにあるかのように呼び出すと、入力の最後に到達したときに取得されます。はストリームに存在する文字ではありませんが、入力の終わりに到達したことを示す番兵の値です。myInputEOFEOF

追加の警告として、エラーが発生した場合にgetchar()も返さEOFれると思いますので、確認してくださいferror()。以下の例(テストされていませんが、アイデアは得られます)。

main() {
    int c;
    do {
        c = getchar();
        if (c == EOF && ferror()) {
            perror("getchar");
        }
        else {
            putchar(c);
        }
    }
    while(c != EOF);
}
于 2010-09-09T13:18:27.670 に答える
11

文字列は、C定義上、で終了し'\0'ます。あなたは"C strings"あなたのプログラムに何もありません。

プログラムは、標準入力(キーボード)から文字を読み取り(ENTERまでバッファリング)、標準出力(画面)に書き戻します。入力する文字数や入力時間に関係なく、これを実行します。

プログラムを停止するには、標準入力にこれ以上データがないことを示す必要があります(ええと??キーボードにこれ以上データがないのはどうしてですか?)

Ctrl+ D(Unix)またはCtrl+ (Windows)を押すだけZで、ファイルが最後に到達したように見せかけることができます。
Ctrl+ D(またはCtrl+ Z)は、実際Cには単語の意味での文字ではありません。

入力リダイレクトを使用してプログラムを実行する場合、これEOFは実際のファイルの終わりであり、信頼できるものではありません。
./a.out < source.c

于 2010-09-09T13:29:29.147 に答える
3

getchar()入力の1文字を読み取り、その文字を関数の値として返します。文字の読み取り中にエラーが発生した場合、または入力の終わりに達した場合はgetchar()、で表される特別な値を返しますEOF

于 2010-09-09T13:14:38.083 に答える
2

の定義によればgetchar()、標準入力から文字を読み取ります。残念ながらstdin、キーボードと間違えられますが、これは当てはまらない可能性がありますgetchargetcharとしてバッファを使用しstdin、一度に1文字を読み取ります。あなたの場合、がないEOFので、getcharputcharは複数回実行されており、文字列全体が一度に印刷されているように見えます。小さな変更を加えると、次のことがわかります。

putchar(c);
printf("\n");     
c = getchar();

次に、元のコードと比較した出力を確認します。

getcharバッファリングの概念を説明する別の例stdin

void main(){
int c;
printf("Enter character");
c = getchar();
putchar();
c = getchar();
putchar();
}

最初のケースでは2文字を入力します。2回目のgetchar実行時に、文字を入力していますか?いいえ、それでもputchar機能します。

これは最終的にはバッファがあることを意味し、何かを入力してEnterをクリックすると、これがバッファに落ち着きます。getcharこのバッファをとして使用しstdinます。

于 2015-01-14T07:32:27.993 に答える