Escape-символ "backspace "'b': неожиданное поведение?


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

Так я иду, чтобы проверить его, и есть некоторые очень странное поведение:

#include <stdio.h>

main ()
{
    printf("hello worlbbdn");
}

выход

hello wodl

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

5 76

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

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