1

私が以下のCコードを持っているとしましょう:

int getLine (char line[])
{
    int c, i=0;
    while( (c=getchar()) != EOF )
           line[i++]=c;
    line[i++] = c;
    return i;
}

>> Enter: 007
>> ^Z
>> Output: 

上記の出力方法を注意深く観察すると、EnterEOFを刺激する前に押しています。つまり、文字列の長さは3ではなく4です(EOFを除く)。

私がエクササイズをしているとき、私はその余分な\nで本当にいくつかの問題に直面しています。

改行なしでEOFを刺激するにはどうすればよいですか?それは可能ですか?

>> Enter: 007^Z
>> ^Z
>> Output: length=6
4

2 に答える 2

2

私のコメントを答えに変換する:

どのプラットフォームで?Unixおよび派生物では、EOF'文字'を2回入力しますが、通常control-Dはではcontrol-Zありません。これはWindowsでも機能する可能性があります。わかりませんが、試してみる価値はあります。

(応答コメントは、プラットフォームがWindowsであることを確認します。)

Unixでは、control-Dその行のデータをプログラムで使用できるようにします。1つ目control-Dは、すでに入力した内容を示します。2つ目は、読み取りに0バイトを与えます。これは、EOFを示します。

于 2013-01-07T16:14:42.630 に答える
1

次に、ループ内に改行を格納しないようにします。値に関係なく、すべての文字を格納する必要があるわけではありません。:)

また、文字列を正しく終了していません。これ:

line[i++] = c;

する必要があります:

line[i] = '\0';

そしてもちろん、それはバッファオーバーフローに敏感です。

一般的には、を使用する方がよいでしょうfgets()

編集:私は要点を見逃しているかもしれませんが、EOFあなたがしたいのが行を読むことだけであるならば、焦点全体が...誤った方向に進んでいるようです。行は通常、で終了しませんEOFが、で終了し\nます。したがって、関数はおそらく、またはが検出されるまで文字を格納する必要 EOFあり\nます。

于 2013-01-07T16:03:01.177 に答える