2

入力された行数をカウントするための私のコードは機能しているようです。ここにあります:

#include <stdio.h>

int main()
{
    int counter = 0;

    while(getchar() != EOF)
    {
        if(getchar() == '\n')
        {
            counter += 1;
        }
    }

    printf("Counter: %d", counter);

    return 0;
}

しかし、私の質問は、なぜ K&R の本で getchar の戻り値が while ループ条件で true または false であるかのみがテストされるときに、変数に格納されているのですか? そうする理由はありません。

K&R のバージョン:

#include <stdio.h> 

main() 
{ 

int c, nl; 
nl = 0; 
while ((c = getchar()) != EOF) 
if (c == '\n') ++nl; 

printf("%d\n", nl); 
}

「int c」が getchar の戻り値を格納していることに注意してください。

4

6 に答える 6

5

たとえば、最初getchar()に改行を読み取り、条件'\n !=EOFが真になると、ループ内に入ります

 while(getchar() != EOF)   

      {
        if(getchar() == '\n') // here reads next character that is not newline
        {
            counter += 1; // missed counting newline , which read by first `getchar()`
        } 
   }  

上記のように、1つは正しく機能しません。

于 2013-10-15T18:26:59.033 に答える
4

あなたがしていることは、文字を読んで、それが と等しいかどうかをチェックしていることですEOF。次に、別の文字を読み取り、それを と比較してい\nます。これはあなたに間違った答えを与えるかもしれないし、与えないかもしれませんが、アプローチは正しくなく、時々失敗します。

本では、彼らは文字を読み取り、それを変数 c に格納し、それが であるかどうかを確認しますEOF。次に、どちらが適切な方法であるかを比較cします。\n

于 2013-10-15T18:26:12.810 に答える
2

K&R が変数を使用する理由は、getchar()反復ごとに変数が 2 回呼び出されないようにするためです。 を呼び出すたびgetchar()に、入力ストリームの状態が変更されます。

于 2013-10-15T18:27:15.353 に答える
1

Kunal の回答を明確にするために、2 番目の getchar() がファイルから別の文字を読み取るため、バージョンは 2 文字ごとに 1 文字の EOF/改行のみをチェックします。K&R's はすべてのキャラクターに対してそうします。

于 2013-10-15T18:28:14.123 に答える