2

ここに投稿するのは初めてなので、これが意図したとおりになることを願っています。

私は K&R の初期の演習の 1 つを行っています。目的は、getchar() を使用してユーザーから一連の文字を取得し、putchar() を使用してそれらを出力することですが、余分なスペースはスキップします。演習に対する私の解決策はうまく機能しますが、その理由がわかりません。

プログラムは次のとおりです。

#include <stdio.h>

int main()
{
    int c, spc;
    c = 0;
    spc = 0;

    while(c != EOF)
    {
        c = getchar();

        if(c == ' ')
        {
            if(spc != 1)
            {
                putchar(c);
                spc = 1;
            }
        }
        if(c != ' ')
        {
            spc = 0;
            putchar(c);
        }
    }
    return 0;
}

ループは 1 つだけで、最初の繰り返しで期待どおり getchar() に到達すると実行が停止します。キャリッジ リターンが押されると、プログラムはユーザーがバッファに入力した内容を出力します。余分なスペースは除きます。まさに本来の動作です。

しかし、私が理解していないのは、getchar() に遭遇したときに、ループの後続の反復ごとに実行が停止しない理由です。/n 文字はそれと関係がありますか? 改行も出力され、すべてが出力された後、getchar() で再び停止することに気付きました。では、バッファ内のすべてを出力する際に​​、各反復の開始時に getchar() をスキップするのはなぜですか?

私は長い間 C をいじっていましたが、「正しい」方法で学ぶ努力をしたのはつい最近のことです。私にはある程度の経験があるので、答えをあまり馬鹿にする必要はありません(つまり、5 歳ではなく 10 歳に説明するように)。

4

2 に答える 2

4

stuff を入力して Enter キーを押すと、すべてが内部バッファに保存されます。そのため、ループが実行されるたびに、そのバッファーに*getchar移動する人がヒットし、1 文字がプルされます。

しかし、私が理解していないのは、ループの後続の反復ごとに実行が停止しない理由です

getcharプログラムは、そのバッファーに何も見つからない場合にのみ停止します。\nこの場合、特別なことは何もありません。CLI は、リターン キーを押すまで入力内容を実際にプログラムに "送信" しない (つまり、バックスペース キーなどを押すことができる) という慣例にすぎません。

于 2012-11-29T08:10:51.503 に答える
0

while (c != EOF)を押した後に終了しEOFます。入力後にを押してみてくださいCtrl + D

于 2012-11-29T11:13:26.117 に答える