将模板字符串中的 \b 处理为 C 中的 printf

Bru*_*ceM 0 c terminal printf escaping

有人可以解释一下或给我指出一个参考资料,解释为什么在第一个打印的行下面的代码片段中包含整个单词hello,而在第二个中打印的行仅包含字母he?我认为退格转义字符会删除最后三个字母,无论换行转义如何。我已经阅读了 GNU 文档printf,但找不到任何要点。

int main(void)
{
    printf("hello\b\b\b\n");        
    return 0;
}



int main(void)
{
    printf("hello\b\b\b");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Nat*_*dge 5

这实际上并不是一个关于 C 或 printf 的问题。在每种情况下,代码都按照其说明进行操作:在第一个示例中,它输出 9 个字符h e l l o \b \b \b \n,在第二个示例中,它同样输出 8 个字符。如果将标准输出写入文件,则该文件正是该文件将包含的内容。但是,如果您写入终端,您的终端可能会\b通过退格来处理,因此您的问题实际上与您的终端有关。你还没有说你正在使用什么终端。

退格字符的一种常见方式是将光标向左移动一个位置,但实际上并不删除该位置的字符。下一个字符输出将被写入其上。

在第一个示例中,您将光标移回到第一个l,但您永远不会在它或任何其他字符上写任何内容。然后\n不会更改屏幕上的任何字符,而只是将光标移动到下一行。所以你仍然看到hello前一行。

l在第二个示例中,当程序终止时,光标保留在第一个示例上。因此,下一个将输出写入终端的程序将覆盖该字符(除非下一个程序的第一次写入是\n这样的)。下一个程序可能是您的 shell,因此 shell 提示符中的字符可能会覆盖llo,因此您看不到它们。