Другие языки программирования и технологии

Язык Си. Читаю K&R (книга автора языка с примерами). Упражнение 1.10

Упражнение 1.10. Напишите программу, копирующую вводимые символы в выходной поток с заменой
символа табуляции на \t, символа забоя на \b и каждой обратной наклонной черты на \\. Это сделает
видимыми все символы табуляции и забоя.
Объясните, как должна работать программа? можно на псевдокоде или сразу на языке Си, но можно использовать только то что прошли до этого упражнения ( т. е только конструкцию if ).
Вот как я читаю эту программу:
--------------------------------------------
Подключить стандартную библиотеку

функция мейн
цикл ( (прочитать символ и присвоить переменной c) не равно EOF)
если введенный нами символ табуляция
то печатать \t;
если введенный нами символ это символ забоя
то печатать \b;
если введенный нами символ обратный слэш
то печатать \\;
печатать (с);
----------------------------------------
ну примерно так, но суть ясна.
я ввожу- My name \is Jhon
на выход получаю- My\t name\t \\is\t Jhon

ВОТ МОИ вопросы:
1) Как именно происходит замена? там что заменяется символ? как то не понимаю) я ведь его ввел, а он не удаляется никуда, потому что нужно заменить и как это сделать? Если ( c == '\t'), то печатай \t. как должно заменяться? объясните этот момент)
2) Я сомотрел решение, и там было, типо надо ещё показать программе что будет, если с не равно этим символам, то putchar(c) и вот только тогда он выводит правильно. Но зачем программе знать что будет если не равно? зачем это нужно? ведь программа должна работать корректно, если ни одно условие не истина то выводи просто символ.
3) про фигурные скобки тоже, если можно пару слов ?

Марк
Марк
44
Твой алгоритм ошибочен:

если введенный нами символ табуляция, то
печатать \t
иначе если введенный нами символ это символ забоя, то
печатать \b
иначе если введенный нами символ обратный слэш, то
печатать \\
иначе
печатать введённый символ

Мы ничего не меняем. Мы получаем символы текста и выводим символы. Если очередной введённый символ '\t', '\b' или '\\' - выводим заданную последовательность символов. В противном случае выводим полученный символ без изменений.

while ((c = getchar()) != EOF) {
if (c == '\t') printf("\\t");
else if (c == '\b') printf("\\b");
else if (c == '\\') printf("\\\\");
else putchar(c);
}

Тело оператора в языке C может содержать только один оператор. Потому, если в if, while и т. д. требуется написать несколько операторов, то их заключают в фигурные скобки - превращая в один составной оператор. Фигурные скобки в C-style языках играют ту же самую роль, что и begin / end в Pascal.

Хорошим стилем является ВСЕГДА использовать фигурные скобки. Это убережёт от множества ошибок:

while ((c = getchar()) != EOF) {
if (c == '\t') {
printf("\\t");
} else if (c == '\b') {
printf("\\b");
} else if (c == '\\') {
printf("\\\\");
} else {
putchar(c);
}
}
Сергей Басов
Сергей Басов
78 580
Лучший ответ
Марк Огромное спасибо, всё чёкто быстро и по делу ответили, но ЗАГВОЗДКА
можете показать как записать алгоритм без else так как читатель не знаком с данной конструкцией, до этого упражнения и слово там нет про else
хочу посмотреть на ваше решение, хотя решение я уже знаю, но всё равно есть пару вопросов.
ну так замена и означает, что печатается не символ "c" а то что в printf. поэтому, putchar должен срабатывать только если текущий символ не попал ни в одну ветку выше. пиши в одну конструкцию : if ...else if ...else if ...else putchar
Марк т. е путчар должен быть тоже внутри цикла? так, аааааа поняллл, типо если бы путчар был за скобками ну всмысле за предпоследней то программа сразу не выводила бы так?
Рамиль Вахитов не цикла, а ветвления внутри цикла.
путчар у тебя выполняется независимо ни от каких условий, он стоит отдельной инструкцией, поэтому символы не заменяются, а добавляются.

Похожие вопросы