Ваш результат будет зависеть от того, в каком терминале или консольной программе вы работаете, но да, в большинстве случаев\b
это неразрушающий backspace. Он перемещает курсор назад, но не стирает то, что там есть.
Итак, со hello worl
стороны, код выводит
привет Ворл
^
... (где ^
показано, где находится курсор) Затем он выводит два \b
символа, которые перемещают курсор назад на два места без стирания (на вашем терминале):
привет Ворл
^
Обратите внимание, что теперь курсор находится на r
. Затем он выводит d
, который перезаписывает r
и дает нам:
привет, водл
^
Наконец, он выводит \n
, что является неразрушающим символом новой строки (опять же, на большинстве терминалов, включая, видимо, ваш), поэтому l
остается неизменным, а курсор перемещается в начало следующей строки.
r
наd
. Объяснение все еще уместно.cmd.exe
иcommand.com
терминалы не всегда вставлять (вы можете использовать клавишу Ins для переключения поведения). Я был удивлен, обнаружив, что Gnome Terminal на моем основном компьютере * nix всегда вставляет, даже не кажется, что он предпочитает его, не говоря уже о переключении на основе клавиши Ins. Никогда раньше этого не замечал. Ясно, что я почти никогда не хочу набирать текст. :-)источник
'\n'
него нет изображения на экране. То, что уже есть, остается неизменным; не заменяется пробелом или любым другим символьным представлением.Если вам нужен деструктивный backspace, вам понадобится что-то вроде
т.е. пробел, пробел и еще один пробел.
источник
\b
будет означать, что следующий выходной символ перезапишет его.0x7f
), я в тупике.Нетрудно объяснить ... Это похоже на набор текста
hello worl
, двойное нажатие клавиши со стрелкой влево, набор текстаd
и нажатие клавиши со стрелкой вниз.По крайней мере, как я заключаю ваш терминал interpeting
\b
и\n
коды.Перенаправьте вывод в файл, и я уверен, вы получите что-то совершенно другое. Хотя вам, возможно, придется взглянуть на байты файла, чтобы увидеть разницу.
[редактировать]
Чтобы уточнить немного, это
printf
испускает последовательность байтов:,hello worl^H^Hd^J
где^H
- символ ASCII # 8 и^J
является символом ASCII # 10. То, что вы видите на экране, зависит от того, как ваш терминал интерпретирует эти управляющие коды.источник
Используйте один пробел после каждого символа
printf("hello wor\bl\bd\n");
источник