Подтвердить что ты не робот

"Backspace" escape-символ "\ b" в C, неожиданное поведение?

Итак, я, наконец, читаю K & R, и я узнал что-то на первых нескольких страницах, что есть escape-символ возврата назад, \b ".

Поэтому я иду проверить это, и есть очень странное поведение.

#include <stdio.h>

main ()
{
    printf("hello worl\b\bd\n");
}

Выходной сигнал

hello wodl

Кто-нибудь может это объяснить?

4b9b3361

Ответ 1

Ваш результат будет зависеть от того, какой терминал или консольная программа вы используете, но да, в большинстве \b это неразрушающее обратное пространство. Он перемещает курсор назад, но не стирает его.

Итак, для части hello worl код выводит

hello worl
          ^

... (где ^ показывает, где находится курсор) Затем он выдает два символа \b, который перемещает курсор назад на два места без стирания (на вашем терминале):

hello worl
        ^

Обратите внимание, что курсор теперь находится на r. Затем он выдает d, который перезаписывает r и дает нам:

hello wodl
         ^

Наконец, он выводит \n, который является неразрушающей новой строкой (опять же, на большинстве терминалов, включая, по-видимому, ваши), поэтому l остается неизменным и курсор перемещается в начало следующей строки.

Ответ 2

..........
^ <= pointer to "print head"
            /* part1 */
            printf("hello worl");
hello worl
          ^ <= pointer to "print head"
            /* part2 */
            printf("\b");
hello worl
         ^ <= pointer to "print head"
            /* part3 */
            printf("\b");
hello worl
        ^ <= pointer to "print head"
            /* part4 */
            printf("d\n");
hello wodl

^ <= pointer to "print head" on the next line

Ответ 3

Если вы хотите разрушительное backspace, вам понадобится что-то вроде

"\b \b"

то есть. backspace, пробел и другое backspace.

Ответ 4

Не слишком сложно объяснить... Это похоже на ввод hello worl, дважды нажатие клавиши со стрелкой влево, ввод d и нажатие клавиши со стрелкой вниз.

По крайней мере, так я заклюрую, что ваш терминал взаимодействует с кодами \b и \n.

Перенаправить вывод в файл, и я уверен, вы получаете что-то еще полностью. Хотя вам, возможно, придется посмотреть на байты файлов, чтобы увидеть разницу.

[править]

Чтобы разработать бит, этот printf испускает последовательность байтов: hello worl^H^Hd^J, где ^H является символом ASCII # 8 и ^J является символом ASCII # 10. То, что вы видите на экране, зависит от того, как ваш терминал интерпретирует эти управляющие коды.

Ответ 5

Используйте одно обратное пространство после каждого символа   printf("hello wor\bl\bd\n");