Экранирующий символ "Backspace" '\b': неожиданное поведение?
Итак, я наконец прочитал K&R и кое-что узнал на первых нескольких страницах, что есть экранирующий символ возврата на задний план, \b
,
Итак, я иду проверить это, и есть очень странное поведение:
#include <stdio.h>
main ()
{
printf("hello worl\b\bd\n");
}
Выход
hello wodl
Кто-нибудь может объяснить это?
5 ответов
Ваш результат будет зависеть от того, какой терминал или консольную программу вы используете, но да, на большинстве \b
это неразрушающий забой. Он перемещает курсор назад, но не стирает то, что там.
Так что для hello worl
часть, код выводит
привет мир ^
...(где ^
показывает, где находится курсор) Затем он выводит два \b
символы, которые перемещают курсор назад на два места без стирания (на вашем терминале):
привет мир ^
Обратите внимание, что курсор теперь находится на r
, Тогда это выводит d
, который перезаписывает r
и дает нам:
привет водл ^
Наконец, это выводит \n
, который является неразрушающим символом новой строки (опять же, на большинстве терминалов, включая, по-видимому, ваш), поэтому l
остается без изменений, а курсор перемещается в начало следующей строки.
.......... ^ <= указатель на "печатающую головку"
/* part1 */
printf("hello worl");
привет мир ^ <= указатель на "печатающую головку"
/* part2 */
printf("\b");
привет мир ^ <= указатель на "печатающую головку"
/* part3 */
printf("\b");
привет мир ^ <= указатель на "печатающую головку"
/* part4 */
printf("d\n");
привет водл ^ <= указатель на "печатающую головку" на следующей строке
Если вы хотите разрушительного возврата, вам нужно что-то вроде
"\b \b"
то есть возврат, пробел и другой возврат.
Не слишком сложно объяснить... Это как печатать hello worl
, дважды нажав клавишу со стрелкой влево, набрав d
и нажав клавишу со стрелкой вниз.
По крайней мере, я так понимаю, что ваш терминал интерпретирует \b
а также \n
коды.
Перенаправьте вывод в файл, и я уверен, что вы получите что-то еще полностью. Хотя, возможно, вам придется посмотреть на байты файла, чтобы увидеть разницу.
[редактировать]
Чтобы уточнить немного, это printf
испускает последовательность байтов: hello worl^H^Hd^J
, где ^H
является символом ASCII № 8 и ^J
является символом ASCII #10. То, что вы видите на экране, зависит от того, как ваш терминал интерпретирует эти контрольные коды.
Используйте одну клавишу возврата после каждого символа printf("hello wor\bl\bd\n");