Похоже, это хорошее упражнение, позволяющее избежать частых ошибок.
Хотя это может быть решено многими способами, в следующем фрагменте показано, как изменить логику размещенного конечного автомата, чтобы массив длин мог заполняться с самого начала, не пропуская первый элемент array[0]
, вплоть до (но не более) его максимальный размер.
#include <stdio.h>
#define IN 1
#define OUT 0
#define MAXLENGTH 16
int main(void)
{
int array[MAXLENGTH] = {0};
int c, state = OUT,
n_words = 0; // <-- this name may better convey the purpose of this variable
while ((c = getchar()) != EOF)
{
if (c == '\n' || c == ' ') // <-- Consider isspace() and iscntrl() instead.
{
// We are between words.
state = OUT;
}
else
{
// Check the current state before updating it.
if ( state == OUT )
{
// A new word starts, but there might not be enough space.
if ( n_words == MAXLENGTH )
{
// Here, the rest of the stream is not consumed
ungetc(c, stdin);
break;
}
++n_words;
}
state = IN;
// Array indices are zero based, so the current word is:
++array[n_words - 1];
}
}
if ( c != EOF )
fprintf(stderr, "Sorry, out of space.\n");
// You can use the actual number of read words to limit the extent of the loop
printf(" %5s %5s\n---------------\n", "Word", "Length");
for (int i = 0; i < n_words; i++)
printf("%5d %5d\n", i + 1, array[i]);
}
Код для тестирования здесь .