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. Что вы видите на экране, зависит от того, как ваш терминал интерпретирует эти коды контроля.