2

K & R の「C プログラミング言語」を使用します。入力の単語の長さのヒストグラムを取得するために、演習 1-13 を実行しようとしています。以下は私が試したことです。最後の単語の長さがわかりません。これを修正するにはどうすればよいですか?

#define space ' '
#define maxLength 100
#include <stdio.h>

int main() {
  int c, result[maxLength], count, i, maxWordLength;
  count = maxWordLength = 0;
 for (i = 0; i < maxLength; ++i)
    result[i] = 0;
  while ((c = getchar ()) != '0') {
    if (!((c == space) || (c == '\t') || (c == '\n')))
        ++count;
    else {
      ++result[count];
      if (count > maxWordLength)
        maxWordLength = count;
      count = 0;
    }
  }
  for (i = 1; i <= maxWordLength; ++i)
    printf("\n%d\t%d\n", i, result[i]);
  return 0;
}

以下は私の入力です

1 12
123 1234    12345
1234560

出力は次のようになりますが、最後の単語の長さは示されていません

1   1

2   1

3   1

4   1

5   1

なぜそうなるのか理解できました。しかし、どうすれば修正できますか?

4

2 に答える 2

3
while ((c = getchar ()) != '0')

する必要があります

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

0そうしないと、プログラムは最初の文字で停止します1234560。また、最後の入力行が改行で終了していない場合は、それも考慮する必要があります。

EOFファイルの終わりまたは読み取りエラーが発生した場合に返されます。

于 2013-06-21T18:17:49.787 に答える
1

0入力を終了する に到達すると、最後の単語の長さをヒストグラムに追加せずに、ループを終了します。可能な修正は、ループの後にこれを追加することです:

   ...
}
/* Take last word into account */
++result[count];
if (count > maxWordLength)
maxWordLength = count;

0もちろん、これは文字が入力の終わりを示し、データの一部ではないことを前提としています。

于 2013-06-21T18:24:18.790 に答える