while(value[i] != '\0');
Это ваша самая очевидная проблема, в основном это означает:
while value[i] != '\0':
do nothing
end while
Другими словами, если входит в цикл, он будет никогда не выходите из него, потому что ничего не изменится, что повлияет на условие продолжения цикла.
Есть другие проблемы, такие как тот факт, чтовы будете обрабатывать только первую строку, а не весь файл.Сама идея использования fgets
и обработки строки не нужна, когда вы можете просто начать со следующего скелета фильтра:
int ch;
while ((ch = getchar()) != EOF) {
/* process ch */
}
Это будет обрабатывать весь файл символ за символом, пока не будут выполнены все символы (илипока не возникнет ошибка) так что вы можете просто настроить цикл тела, чтобы сделать то, что вам нужно - вы в основном сделали этот бит в своем коде с циклом над символами строки.
Я бы предложил не с использованием следующего кода (поскольку это классная работа), но вы также можете лучше использовать конструкции управления потоком и библиотечные функции (из ctype.h
и string.h
), что-то вроде:
while ((ch = getchar()) != EOF) {
// Lib functions to detect upper/lower-case letters.
if (isupper(ch)) {
++upper;
} else if (islower(ch))
++lower;
}
// And to detect letter/digit type.
if (strchr("aeiouAEIOU", ch) != NULL) {
++vowel;
} else if (isalpha(ch)) {
++consonant;
} else if (isdigit(ch)) {
++digits;
}
++total;
}
Это особенно важно, так как нет никакой реальной гарантии, что нецифровые символы будут последовательными.