Wordcount в C, который поддерживает ввод букв

У меня есть некоторые проблемы с правильным подсчетом слов, так как пропущено единственное число, такое как "Я".

По существу, если пробел между символом / символом или отдельным символом / символом будет подсчитывать количество слов.

#include <stdio.h>

int main()
{
    int wordcount;
    int ch;
    char lastch = -1;

    wordcount = 0;

    while ((ch = getc(stdin)) != EOF) {
        if (ch == ' ' || ch == '\n')
        {
            if (!(lastch == ' ' && ch == ' '))
            {
                wordcount++;
            }
        }
        lastch = ch;
    }

    printf("The document contains %d words.", wordcount);
}

1 ответ

Решение

Вы чрезмерно усложняете свои условные тесты. Если я понимаю вашу цель, единственное, что вас беспокоит, это если lastch != ' ' и либо (ch == ' ' || ch == '\n'),

Дополнительно, getchar возвращает тип int, Следовательно, ch должно быть типа int правильно обнаружить EOF на всех системах.

Упрощая эти изменения, вы можете сделать что-то похожее на:

#include <stdio.h>

int main (void) {

    int wordcount = 0,
        lastch = 0,     /* just initialize to zero */
        ch;             /* ch should be an int */

    while ((ch = getc (stdin)) != EOF) {
        if (lastch && lastch != ' ' && (ch == ' ' || ch == '\n'))
            wordcount++;
        lastch = ch;
    }
    if (lastch != '\n') /* handle no '\n' on final line */
        wordcount++;

    printf ("The document contains %d %s.\n", 
            wordcount, wordcount != 1 ? "words" : "word");

    return 0;
}

Пример использования / Вывод

$ echo "     " | ./bin/wordcnt
The document contains 0 words.

$ echo "   t  " | ./bin/wordcnt
The document contains 1 word.

$ echo "   t t  " | ./bin/wordcnt
The document contains 2 words.

Примечание: для защиты от углового случая файла, не содержащего POSIX eof (например '\n' в конце файла), вам нужно будет добавить дополнительный флаг, чтобы был найден хотя бы один символ, и проверить lastch в комбинации после выхода из цикла, например

#include <stdio.h>

int main (void) {

    int wordcount = 0,
        lastch = 0,     /* just initialize to zero */
        ch,             /* ch should be an int */
        c_exist = 0;    /* flag at least 1 char found */

    while ((ch = getc (stdin)) != EOF) {
        if (lastch && lastch != ' ' && (ch == ' ' || ch == '\n'))
            wordcount++;
        if (ch != ' ' && ch != '\n')    /* make sure 1 char found */
            c_exist = 1;
        lastch = ch;
    }
    if (c_exist && lastch != '\n')  /* handle no '\n' on final line */
        wordcount++;

    printf ("The document contains %d %s.\n", 
            wordcount, wordcount != 1 ? "words" : "word");

    return 0;
}

Пример углового случая

$ echo -n "   t" | ./bin/wordcnt
The document contains 1 word.
Другие вопросы по тегам