Я также начинаю с учебника K & R, и я нашел решение, которое использует только материал, который был рассмотрен до этого момента.
Как это работает:
Во-первых, установите некоторые счетчики «пробелов» на ноль. Используется для подсчета пробелов.
Если пробел найден, увеличьте счетчик «пробелов» на единицу.
Если пробел не найден, то сначала проведите подтест: счетчик «заготовок» равен или больше 1? Если да, то сначала напечатайте пробел, а после этого установите счетчик «заготовок» на ноль.
После того, как этот подтест завершен, вернитесь и вставьте символ, который не был найден пустым.
Идея состоит в том, чтобы перед размещением непустого символа сначала выполнить тест, чтобы увидеть, были ли подсчитаны некоторые пробелы ранее. Если раньше были пробелы, сначала напечатайте одну пробел, а затем сбросьте счетчик пробелов. Таким образом, счетчик снова равен нулю для следующего раунда пробелов. Если первый символ в строке не является пробелом, счетчик не мог увеличиться, поэтому пробел не печатается.
Одно предупреждение, я не слишком углубился в книгу, поэтому я еще не знаком с синтаксисом, поэтому возможно, что фигурные скобки {} могут быть написаны в разных местах, но мой пример работает нормально.
#include <stdio.h>
/* Copy input to output, replacing each string of one or more blanks by a single blank. */
main()
{
int c, blanks;
blanks = 0;
while ((c = getchar()) != EOF) {
if (c != ' ') {
if (blanks >= 1)
printf(" ");
blanks = 0;
putchar(c); }
if (c == ' ')
++blanks;
}
}