LINUX.ORG.RU

[ K&R ] [ C ] [Упражнение 1.10. ]


0

1

Упражнение 1.10.
Напишите программу для копирования входного потока в выходной с заменой знаков табуляции на \t,
символов возврата назад (Backspace) на \Ь,
а обратных косых черт — на \ \.
Это сделает табуляции и символы возврата легко читаемыми в потоке.

#include <stdio.h>
int main() {
        int gchar, 
        while ((gchar = getchar()) != EOF) {
                if (gchar == '\t') {putchar('\\'); putchar('t');}
                else if (gchar == '\b') {putchar('\\'); putchar('b');}
                else if (gchar == '\\') {putchar('\\'); putchar('\\');}
                else putchar(gchar);
        }
        return 0;
}

И как реализовать (Backspace), если поток буферизированный и (Backspace) просто не передается getchar()?


странно, подсветка синтаксиса не сработала...

zer0n ()

>И как реализовать (Backspace), если поток буферизированный и (Backspace) просто не передается getchar()?

Угадаю: никак. Встречный вопрос: а зачем?

anonymous ()

Скомпилил упражнение в a.out. Теперь: hack.c:

#include <stdio.h>
int main()
{
	printf("\b\t\\");
	return 0;
}

$ gcc hack.c -o hack
$ ./hack 
	\$
$ ./hack | ./a.out 
\b\t\\

tim239 ()
Ответ на: Re: Для общего развития от tim239

> перечитал ман, потом стандарт c99 про EOF, getc и getchar. По-моему, на https://www.securecoding.cert.org парят

Приведите что ли выдержки из стандарта, опровергающие мнение специалистов CERT.

Я на всякий случай не буду упоминать, что это серьезная организация чей авторитет в сфере безопасности немного повыше вашего.

ntp ()
Ответ на: Re: Для общего развития от tim239

Еще уточню, что Fortify SCA не их разработка (только не говорите, что у вас на работе не используют статический анализатор кода), а CERT C Rule Pack свободно доступен для скачивания. Нищеброды не накопившие на Fortify или LDRA могут использовать ROSE.

ntp ()
Ответ на: комментарий от true_admin

> Что типа может попастся такой входной символ который совпадёт со значением EOF?

Угу. По ссылке написано. Например, аналогичная (хоть и старая) уязвимость баша: http://www.cert.org/advisories/CA-1996-22.html

ntp ()
Ответ на: комментарий от ntp

Блин. Перечитал все ещё раз. Да, можно сделать такой компилятор, в котором бы константа EOF типа int совпадала бы со значением типа char. Надеюсь когда-нибудь в стандарте это запретят. Но это не повод не пользоваться EOF когда sizeof(int)>sizeof(char).

tim239 ()
Ответ на: комментарий от tim239

> это не повод не пользоваться EOF когда sizeof(int)>sizeof(char)

CERT и приводит один из способов решения проблемы через явный запрет компиляции на архитектурах где это не так.

ntp ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.