подсчет слов из пользовательского ввода - PullRequest
0 голосов
/ 13 мая 2019

программа не может выйти из цикла while while (c != EOF)

Я пробовал это в терминале

#include <stdio.h>

main() {
    int c = getchar();
    int n = 0;
    while (c != EOF) {
        if (c == ' ') {
            while (c == ' ')
                c = getchar();
        }
        else {
            ++n;
            while (c != ' ')
                c = getchar();
        }

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

это должно показать нет слов. однако он запрашивает ввод после ввода

1 Ответ

4 голосов
/ 13 мая 2019
  • программа не может выйти из цикла while while (c != EOF)

    Это потому, что вы не проверяете EOF во внутренних while -loops:

    while (c == ' ')
        c = getchar();
    

    ~>

    while (c == ' ' && c != EOF)
        c = getchar();
    
  • Вы отметили свой вопрос kernigham-and-ritchie . Я надеюсь, что вы просто пользуетесь книгой и не собираетесь изучать этот предстандартный *) стиль C.

  • Тип возврата main() отсутствует.
  • Когда функция не принимает аргументов в C, список параметров должен быть void, поэтому

    int main(void)
    
  • Я бы посоветовал вам сделать

    int ch;
    while ((ch = getchar()) != EOF) {
        // process ch
    }
    
  • c == ' '
    

    Есть и другие пробелы, кроме пространства. См. <ctype.h> для списка функций для классификации персонажей.


* +1054 * Пример:
#include <stddef.h>   // size_t
#include <stdbool.h>  // bool, true, false
#include <ctype.h>    // isalnum()
#include <stdio.h>    // getchar(), printf()

int main(void)
{
    size_t num_words = 0;
    bool in_word = false;
    int ch;

    while ((ch = getchar()) != EOF) {
        if (!in_word && isalnum(ch)) {  // new word begins. isalnum() or isalpha()
            in_word = true;             // ... depends on your definition of "word"
            ++num_words;
            continue;  // continue reading
        }
        else if (in_word && isalnum(ch)) {  // still inside a word
            continue;  // continue reading
        }

        in_word = false;  // when control gets here we're no longer inside a word
    }  // when control reaches the end of main() without encountering a return statement
       // the effect is the same as return 0; since C99 *)

    printf("Number of words: %zu\n\n", num_words);
}

Для лучшей переменной-местоположения может быть предпочтительнее for -петл:

for (int ch; (ch = getchar()) != EOF;)  // ...


*) Языковые стандарты:
C99: ИСО / МЭК 9899: TC3
C11: ISO / IEC 9899: 201x (черновик близок к окончательному стандарту)
C18: ИСО / МЭК 9899: 2017 (предложение)

...