программа не может выйти из цикла 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 (предложение)