Здравствуйте.
Читаю книгу Кернигана и Ричи(c pr. lang.), в первой же главе наткнулся на задачу:
2)Напишите программу, копирующую символы ввода в выходной поток и заменяющую стоящие подряд пробелы на один пробел.
Так вот в чем вопрос:как заменить стоящие рядом пробелы,если их кол-во не известно заранее?
пробовал это(ясно почему не работает, но не представляю себе как по другому то?!):
powerfox, у тебя по одному символу в начале слова теряется, как и перевод строки, если она заканчивается на пробел, потому что на границе слова два раза подряд делается getchar();
ты мне очень ценный совет дал. надо думать, что пишешь....
чтож сам-то не пользуешься? а туда же, лезешь советы давать. нехорошо.
Всем спасибо, elide, все работает, но я что-то недопонял в исходнике...
Идет цикл -> если данный символ не равен 0 и предыдущий тоже не равен 0(как машина определяет что prev отвечает за предыдущий символ?) -> она выводит ... Что она выводит?
1) Определяем переменные curr и prev
2) Считываем по символьно до конца файла
3) Если и curr, и prev не пробелы - выводим. Здесь же присваиваем prev значение curr
while( (curr = getchar()) != EOF ) // читаем посимвольно до конца файла
if( curr != ' ' || prev != ' ') // если текущий или предудущий символ - не пробел, то
putchar(prev = curr); // выводим текущий символ, и сохраняем его в переменную prev, чтоб потом принять его за предыдущий...
Насчет исходника от elide
1) Разберись с логическами выражениями
2) Операция присваивания тоже дает результат, т.е. операция prev = curr даст результат curr, поэтому putchar(prev = curr) выведет curr и присвоит prev значение curr
Вообще-то я сам новичек в программировании и сайчас читаю эту книгу. В исходнике от elide сам долго разбирался
2elide: у тебя одна маленькая ошибка: prev нужно инициализировать, пробелом либо не-пробелом в зависимости от того, хотим ли мы, чтобы усекались все пробелы в начале текста или чтобы один оставался. Исходя из условия задачи мне кажется, что правильнее будет инициализировать не-пробелом. А так это лотерея; выстрелит, конечно, вряд ли, но если строго, то всё же.
rpv, огромное спасибо, тут все ясно!
Но все же хотелось бы понять как работает исходник elide'а...
А мне наоборот: у elide всё ясно, а у rpv я запутался
powerfox, у тебя по одному символу в начале слова теряется, как и перевод строки, если она заканчивается на пробел, потому что на границе слова два раза подряд делается getchar();
ты мне очень ценный совет дал. надо думать, что пишешь....
чтож сам-то не пользуешься? а туда же, лезешь советы давать. нехорошо.
Спасибо, не видел этой ошибки: когда проверял печатал "asd dfsd sdf e we we eww we" - поэтому и не заметил, лень было нормально проверять.
Совет(теперь самому себе): тестировать нужно, думая , что пишешь.