4

これは私には意味がありませんが、うまくいけば、あなたの一人がなぜこれをしているのか理解しています。

隣り合った3つの整数は互いに関連しているため、getchar()で3文字を読み取る必要がある割り当てがあるため、次のように構造化されたループを設定します。

int c1, c2, c3 = 0;

while(c3 != EOF) {
    c1 = getchar();
    c2 = getchar();
    c3 = getchar();
    ... do something with them...
}

問題は、文字数が3で割り切れない場合、最後の反復が実行されないことです。したがって、文字「Abcd」が入力された場合、Abcで最初の反復が実行されますが、2番目の反復はDでは何も実行されません。「Abcde」についても同じですが、Abcdefは機能します。

これは宿題なので、私にとっては問題を解決しないでください。しかし、これはgetcharの奇妙な点で、多くの文字が見つからない場合はループを終了するだけですか?

4

3 に答える 3

1

getcharはブロッキング呼び出しであるため、文字を読み取るかEOFが検出されるまで戻りません。

したがって、のいずれかを確認するか、c1対応する呼び出しの後に改行であるかどうかを確認するか(入力行が終了したかどうかを確認するため)、 (* nix、OS X)または(Windows)を押して終了を通知します。ファイル(EOF)。EOFの後、常に。ですぐに戻ります。c2c3getcharCtrl+DCtrl+ZgetcharEOF

于 2012-09-18T00:47:06.337 に答える
0

問題を状態に分解します。さまざまな状態のさまざまな入力で何を実行する必要があるかを定義します。コードに変換します。

あなたの場合、不要な長さの入力がいつあなたに影響を与えるか、そしてそれをどのように扱うかを理解する必要があります。トリプレットでの読み取りは問題なく機能しますが、取得するすべての文字について、エラーを発生させるか、特別な方法で処理する必要があるかを確認する必要があります。

文字列、、、を実行し"""a"、記述"ab"された状態を調べ、それらすべてを適切な方法で処理できるかどうかを確認してください。これが機能する場合、コードの記述は問題にはなりません。"abc""abcd"

于 2012-09-18T14:43:26.780 に答える
0

短いファイルをシミュレートする簡単な方法は、エコーを使用してプログラムにパイプすることです。

echo ABC | ./program_name

このようにして、コマンド ラインでさまざまな文字列をテストできます。echo の出力は、プログラムの stdin にパイプされます。プログラムの stdin は文字列の終わりで閉じられます。これにより、キーボードを直接使用してテストするときに getchar がブロックされる原因となる EOF 問題が回避されます (端末の行/文字入力メソッド以外に)。

もう 1 つの落とし穴は、EOF が int 定数であることです。そのため、後でコードが c1、c2、c3 を char に変換しないかどうかを確認してください。それはそれでいいのですが、char に変換すると EOF との比較ができなくなります。

于 2012-09-18T15:35:54.030 に答える