Вы можете попробовать создать что-то вроде
while ((c = getchar ()) != EOF && c != '\n') {
, а затем добавить строку после while l oop, чтобы учесть последнее слово:
if (c == '\n') {
++digits[nc-1];
nc = 0;
Также есть другая проблема внутри вашей программы. ++digits[nc-1];
правильный, но по неправильной причине. Вы должны сделать это, потому что массив начинается с нуля, т.е. если у вас есть массив длиной 10, он будет go от 0 до 9, поэтому вы должны подсчитать длину слов, а затем добавить единицу в позицию массива length - 1
(так как нет слов нулевой длины). Проблема в том, что вы все еще считаете пробелы или символы новой строки внутри слова, поэтому, если у вас есть два пробела после слова длиной 4, программа добавит в массив слово длиной 5 + a длина слова 1. Чтобы избежать этого, вы должны сделать что-то вроде этого:
while ((c = getchar ()) != EOF) {
if ((c == ' ' || c == '\n' || c == '\t') && nc > 0) {
++digits[nc-1]; // arrays start at zero
nc = 0;
}
else {
++nc;
}
}