“后退空间”转义字符“ b”: 意外行为?

所以我最后通读了 绑架勒索,在前几页我学到了一些东西,有一个退格转义字符,\b

所以我去测试它,有一些非常奇怪的行为:

#include <stdio.h>


main ()
{
printf("hello worl\b\bd\n");
}

输出是

hello wodl

有人能解释一下吗?

174990 次浏览

不太难解释... 这就像输入 hello worl,按两次左箭头键,输入 d,然后按下箭头键。

至少,这就是我如何推断你的终端是解码 \b\n的代码。

Redirect the output to a file and I bet you get something else entirely. Although you may have to look at the file's bytes to see the difference.

[编辑]

详细说明一下,这个 printf发出一个字节序列: hello worl^H^Hd^J,其中 ^H是 ASCII 字符 # 8,^J是 ASCII 字符 # 10。您在屏幕上看到的内容取决于您的终端如何解释这些控制代码。

您的结果将取决于什么类型的终端或控制台程序,但是,是的,在大多数 \b是一个 nondestructive退格。它将光标向后移动,但不会擦除那里的内容。

因此,对于 hello worl部分,代码输出

hello worl
^

... (其中 ^显示光标在哪里)然后输出两个 \b字符将光标向后移动两个地方 without擦除(在您的终端上) :

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

If you want a destructive backspace, you'll need something like

"\b \b"

例如,一个退格,一个空格,和另一个退格。

在每个字符后面使用一个退格 printf("hello wor\bl\bd\n");