KR - визуализировать backspace

Я сталкиваюсь с этим упражнением KR 1-10:

Напишите программу, которая копирует ввод в вывод, заменяет каждую табуляцию на \t, каждый символ возврата на \b и каждую обратную косую черту на \\ .

Вот очень простое решение:

#include <stdio.h>

int main()
{
    int c;
    const char TAB = '\t';
    const char BACKSPACE = '\b';
    const char BACKSLASH = '\\';
    while( EOF != ( c = getchar() ) )
    {
        if( TAB == c )
        {
            printf( "\\t" );
        }
        else if( BACKSPACE == c )
        {
            printf( "\\b" );
        }
        else if( BACKSLASH == c )
        {
            printf( "\\\\" );
        }
        else
        {
            putchar( c );
        }
    }

    return 0;
}

Я обнаружил, что он работает нормально для визуализации Tab и \ (обратная косая черта), но не для Backspace. Похоже, что Backspace не запоминаются консолью? У меня убунту 14.04.


Это кажется похожей проблемой, но не совсем уверен это то же самое.


person artm    schedule 29.08.2015    source источник
comment
Ты прав. Ваш код в порядке, это терминал, который более продвинут, чем этот гипотетический сценарий.   -  person uri2x    schedule 29.08.2015
comment
Не имеет отношения к проблеме, но c должно быть int, а не char.   -  person Spikatrix    schedule 29.08.2015
comment
да спасибо - исправил.   -  person artm    schedule 29.08.2015


Ответы (1)


Я предполагаю, что вы запускаете свою программу в терминале, а затем вводите какой-то ввод. Терминал обычно находится в режиме готовки, где возврат на одну позицию будет немедленно интерпретирован как пожалуйста, сотрите предыдущий символ. getchar() никогда не вернет backspace.

Если вы хотите проверить свою программу на правильную обработку пробелов, направьте их на стандартный ввод, это позволит избежать использования терминала с соответствующим приготовлением:

 $ printf 'foo\bbar\n' | ./a.out
 foo\bbar
person Jens    schedule 29.08.2015
comment
Да, я проверил это через терминал, и действительно, backspace никогда не сохранялся. Кстати, какие рекомендации по чтению для терминала cooked mode? - person artm; 03.09.2015
comment
@artm Что представляет собой режим приготовления (и все другие настройки терминала), обычно можно найти на странице руководства stty(1). - person Jens; 03.09.2015