Escape-символ "backspace "'b': неожиданное поведение?
Так что я, наконец, читаю K&R, и я узнал кое-что в течение первых нескольких страниц, что есть Backspace escape-символ, b
.
Так я иду, чтобы проверить его, и есть некоторые очень странное поведение:
#include <stdio.h>
main ()
{
printf("hello worlbbdn");
}
выход
hello wodl
может кто-нибудь объяснить это?
5 ответов:
ваш результат будет варьироваться в зависимости от того, какой терминал или консольная программа вы находитесь, Но да, на большинстве
\b
- это неразрушающий клавиша "Backspace". Он перемещает курсор назад, но не стирает то, что есть.так
hello worl
часть код выводитhello worl ^...(где
^
показывает, где находится курсор), то он выводит два\b
символы, которые перемещают курсор назад на два места без удаление (на терминал):hello worl ^обратите внимание, что курсор теперь находится на
r
. Затем он выводитd
, который перезаписываетr
и дает нам:hello wodl ^наконец, он выводит
\n
, который является неразрушающей новой линией (опять же, на большинстве терминалов, включая, по-видимому, ваш), поэтомуl
остается неизменным, и курсор перемещается в начало следующей строки.
.......... ^ <= 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
Если вы хотите разрушительное backspace, вам понадобится что-то вроде
"\b \b"
т. е. обратное пространство, пространство и другое обратное пространство.
не слишком трудно объяснить... Это как набирать
hello worl
, дважды нажав клавишу со стрелкой влево, набравd
, и нажав клавишу со стрелкой вниз.по крайней мере, так я делаю вывод, что ваш терминал вставляет
\b
и\n
кодексы.перенаправить вывод в файл, и я уверен, что вы что-то совсем другое. Хотя вам, возможно, придется посмотреть на байты файла, чтобы увидеть разницу.
[edit]
чтобы уточнить немного, это
printf
выдает последовательность байтов:hello worl^H^Hd^J
, где^H
- это символ ASCII #8 и^J
является символом ASCII #10. Что вы видите на экране, зависит от того, как ваш терминал интерпретирует эти коды контроля.