Язык программирования C. Упражнение 1-9 Задача

я делаю это упражнение C, и я не могу заставить его работать. Любые подсказки относительно того, что я делаю неправильно? (я стараюсь не использовать ни scanf, ни printf)

Напишите программу, которая копирует ввод в вывод, заменяя каждую строку из одного или нескольких пробелов одним пробелом.

int main()
{
    int currentChar;
    int wasBlank = 0;
    while((currentChar = getchar()) != EOF){
        if (currentChar != ' ') {
            if (wasBlank) {
               putchar(' ');
               putchar(currentChar);
            }
            putchar(currentChar);
        }
        else
            wasBlank = 1;
    }
    return 0;
}

person Tomas Righetti    schedule 22.08.2020    source источник
comment
wasBlank никогда не сбрасывается. Его необходимо сбросить до 0, когда вы читаете символ без пробела.   -  person Paul Hankin    schedule 22.08.2020
comment
У вас также есть недостающее еще.   -  person Paul Hankin    schedule 22.08.2020
comment
Ааа правильно. Это решило это. Большое спасибо   -  person Tomas Righetti    schedule 22.08.2020


Ответы (1)


wasBlank... необходимо сбросить до 0, когда вы читаете символ без пробела. — хорошая первая идея, но она не решает случай, когда последний символ перед EOF — один пробел.

Печатайте пробелы при первом просмотре, а не повторные.

int main(void) {
  int previousChar = EOF;
  int currentChar;
  while((currentChar = getchar()) != EOF) {
    if (currentChar != ' ' || previousChar != ' ') {
      putchar(currentChar);
    }
    previousChar = currentChar;
  }
  return 0;
}
person chux - Reinstate Monica    schedule 22.08.2020
comment
Вопрос ОП был не «можете ли вы написать эту программу», а скорее «почему моя программа не работает?» - person Caleb; 22.08.2020
comment
@Caleb wasBlank ... необходимо сбросить до 0, когда вы читаете символ без пробела, объясняющий сбой. Этот ответ объясняет, почему предполагаемого исправления связанного комментария недостаточно. Затем показывает исправление. - person chux - Reinstate Monica; 22.08.2020