113

所以我终于通读了K&R,在前几页中我学到了一些东西,有一个退格转义字符,\b.

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

#include <stdio.h>

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

输出是

hello wodl

谁能解释一下?

4

5 回答 5

164

您的结果将根据您使用的终端或控制台程序类型而有所不同,但是是的,大多数\b情况下是非破坏性退格键。它向后移动光标,但不会删除那里的内容。

所以对于这一hello worl部分,代码输出

你好世界
          ^

...(其中^显示光标所在的位置)然后它输出两个\b字符,将光标向后移动两个位置而不擦除(在您的终端上):

你好世界
        ^

请注意,光标现在位于r. 然后它输出d,它覆盖r并给我们:

你好世界
         ^

最后,它输出\n,这是一个非破坏性的换行符(同样,在大多数终端上,显然包括你的终端),所以l保持不变,光标移动到下一行的开头。

于 2011-07-22T16:12:35.420 回答
128
…………
^ <= 指向“打印头”的指针
            /* part1 */
            printf("hello worl");
你好世界
          ^ <= 指向“打印头”的指针
            /* part2 */
            printf("\b");
你好世界
         ^ <= 指向“打印头”的指针
            /* part3 */
            printf("\b");
你好世界
        ^ <= 指向“打印头”的指针
            /* part4 */
            printf("d\n");
你好世界

^ <= 指向下一行“打印头”的指针
于 2011-07-22T16:13:37.920 回答
47

如果你想要一个破坏性的退格,你需要类似的东西

"\b \b"

即退格、空格和另一个退格。

于 2011-07-22T16:31:02.607 回答
8

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

至少,这就是我推断您的终端正在与\b\n代码交互的方式。

将输出重定向到一个文件,我敢打赌你会得到完全不同的东西。尽管您可能必须查看文件的字节才能看到差异。

[编辑]

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

于 2011-07-22T16:10:57.820 回答
2

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

于 2011-11-27T02:04:29.983 回答