0

OKみんな、だから私はこのプログラムを書いた

#include <stdio.h>

/* count words */

main ()
{

    int c, c2;
    long count = 0;

    while ((c = getchar()) != EOF)
    {
        switch(c)
        {
        case ' ':
        case '\n':
        case '\t':
            switch(c2)
            {
            case ' ':
            case '\n':
            case '\t':
                break;
            default:
                ++count;
            }
        }
        c2 = c;
    }
    printf("Word count: %ld\n", count);
}

ご覧のとおり、入力から単語をカウントします。だから私はa-textというファイルを書きました

a text

そして私はubuntuプロンプトに書いた

./cw < a-text

そしてそれは書いた

Word count: 2

それで、一体何?2 番目の単語の後には、タブも改行もスペースもなく、EOF だけなので、1 と数えるべきではありません。なぜこれが起こるのですか?

4

2 に答える 2

0

スペースではなく単語を数えてみませんか? そうすれば、入力がスペースで終わっても問題ありません。

#include <ctype.h>
#include <stdio.h>

int main(int argc, char**argv) {
    int was_space = 1;
    int c;
    int count = 0;
    while ((c = getchar()) != EOF) {
        count += !isspace(c) && was_space;
        was_space = isspace(c);
    }
    printf("Word count: %d\n", count);
    return 0;
}
于 2013-06-22T06:08:35.993 に答える
0

「テキスト」で何が起こるか見てみましょう

after the first iteration, c2 == 'a', count remains 0
now comes c == ' ' c2 is still 'a', so count == 1, c2 becomes == ' '
now comes c == 't' c2 is still ' '. so count remains == 1
...
now comes c == '\n' c2 is the last 't'. count becomes == 2

IOW

"a text\n"
  ^----^-------- count == 1
       |
       +-------- count == 2
于 2013-06-22T06:34:18.907 に答える