"Backspace" escape-символ "\ b" в C, неожиданное поведение?
Итак, я, наконец, читаю K & R, и я узнал что-то на первых нескольких страницах, что есть escape-символ возврата назад, \b
".
Поэтому я иду проверить это, и есть очень странное поведение.
#include <stdio.h>
main ()
{
printf("hello worl\b\bd\n");
}
Выходной сигнал
hello wodl
Кто-нибудь может это объяснить?
Ответы
Ответ 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");