Понимание поведения возврата (\b) в C

Эта программа копирует ввод в вывод, заменяя TAB(\t) на \t backspace(\b) на \b. Но здесь, в моем коде, я не могу прочитать входной символ, когда я ввожу пробел, он не заменяется, поскольку работает вкладка.

Компиляция с помощью GCC в Linux:

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

Предположим, если я наберу vinay (tab) hunachyal

Output:vinay\thunachyal 

Если я наберу vinay (и 1 backspace)

Output:vina

Итак, мой вопрос: почему в этом случае не печатается vina\b?
Можно ли обнаружить \b и напечатать \b? если нет то в чем причина

Note: Мне нужно во время выполнения ввести backspace, не предоставляя отдельный файл с \b


person vinay hunachyal    schedule 04.09.2013    source источник


Ответы (2)


Backspace потребляется интерпретатором оболочки, поэтому ваша программа никогда его не увидит, а также ваш код (слегка) сломан из-за неуместных фигурных скобок, которым не помогает плохой отступ.

Вот исправленная версия:

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

который работает так, как ожидалось:

$ echo 'vinay\thunachyal\b' | ./escape
vinay\thunachyal\b
person trojanfoe    schedule 04.09.2013
comment
Есть ли способ избежать возврата назад, съеденного оболочкой, без создания отдельного файла, мне нужно во время выполнения клавиши возврата - person vinay hunachyal; 04.09.2013
comment
даже мой код тоже работает, если я повторю 'vinay\thunachyal\b' | ./a.out, но мой вопрос, есть ли способ обнаружить возврат во время выполнения программы, поскольку вкладка работает @runtime, как этот возврат, поправьте меня, если я ошибаюсь. - person vinay hunachyal; 04.09.2013
comment
@vinayhunachyal Да, ваша программа делает это. Проблема здесь просто в том, как вы получаете backspace в программе. Использование echo, как указано выше, кажется простым подходом. - person trojanfoe; 04.09.2013

Если я правильно истолковал вопрос, вы можете использовать 'Ctrl-H' для отправки возврата. Используя исправленный код trojanfoe, когда вы вводите:

vinay^H

Он будет печатать:

vinay\b

^H означает «Ctrl-H», это символ ASCII № 8, который является символом возврата.

person user3639467    schedule 15.05.2014