C-K&R упражнение 1-9

ищу упражнение 1-9 из книги K&R (Скопируйте ввод в вывод. Замените каждую строку из нескольких пробелов одним пробелом). Я нашел этот код на этом сайте.

#include <stdio.h>

main()
{
    int ch, lch;
    for(lch = 0; (ch = getchar()) != EOF; lch = ch)
    {
            if (ch == ' ' && lch == ' ')
                ;
            else
                putchar(ch);
    }
}

Программа работает, но операция мне непонятна: для чего нужна переменная lch? Почему бы не вставить его в третье условие цикла for, а оператор if программа не дает правильного вывода?


person link23    schedule 13.03.2020    source источник
comment
Было бы полезно, если бы вы разместили свой вариант, который не работает так, как вы ожидаете. третье условие цикла for и оператор if разобрать немного сложнее, чем C.   -  person mevets    schedule 13.03.2020
comment
Это пример того, почему важны четкие имена переменных. Если бы lch было бы имя last_char, вам пришлось бы задавать вопрос?   -  person Fred Larson    schedule 13.03.2020


Ответы (2)


Вам нужно заменить несколько пробелов одним пробелом. Поэтому, если предыдущий введенный символ был пробелом, а текущий введенный символ также является пробелом, когда вам нужно пропустить текущий символ.

Итак, lch сохраняет значение предыдущего введенного символа. Первоначально, когда еще не было ввода, lch устанавливается равным 0. Затем в каждой итерации lch устанавливается на текущий введенный символ, который в этом операторе if

if (ch == ' ' && lch == ' ')

являются ли пробелами текущий и предыдущий символы. Если да, то программа ничего не выводит.

person Vlad from Moscow    schedule 13.03.2020

lch получает старый символ, поэтому ch получает getchar(), запускает цикл, и когда он завершится, значение принимается lch.

person Rodrigo Machado    schedule 13.03.2020