Вам нужна еще одна переменная, чтобы запомнить, какой был предыдущий символ, чтобы вы могли различить guish окончание слова и пропустить дополнительные разделители, пока не встретится новое слово.
В фрагмент ниже я назвал эту переменную "pcwaswsp". Код скопирован из вашего, с двумя модификациями: 1) новая переменная и 2) я переместил проверку слов сразу после чтения.
int c; // current character
int pcwassp; // "previous character was space"
pcwassp = 0; // previous char is not a space
while (1) {
c = getchar();
if (c == EOF) break; // no more data
// optional: if (pcwassp==2) pcwassp=isspace(c);
// word separation
if (isspace(c)) {
if (!pcwassp)
printf("\n"); // break line only on new word separator
pcwassp = 1; // ...but this char IS a space
continue;
} // else...
pcwassp=0; // ...else, this char is not a space
//ignores numbers and punctuation
...
}
Этот код напечатает новую строку, если его ввод начнется с разделителем. Чтобы исправить это, переменную pcwassp можно инициализировать специальным значением (не 0 и не 1), имеющим значение «первый раз». В цикле, только в первый раз, эта переменная может быть установлена на «предыдущий символ был разделителем» (если текущий символ является пробелом), чтобы вывод первой строки не был пустым.