C中的“退格”转义字符“\ b”,出乎意料的行为?

所以我终于通过K&R阅读,并在前几页学到了一些东西,那就是有一个退格转义字符“ \b ”。

所以我去testing一下,有一些非常奇怪的行为。

 #include <stdio.h> main () { printf("hello worl\b\bd\n"); } 

输出是

 hello wodl 

任何人都可以解释吗?

你的结果将取决于你正在使用什么样的terminal或控制台程序,但是是的,在大多数情况下\b是非破坏性的退格。 它将光标向后移动,但不会擦除那里的内容。

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

你好
           ^

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

你好
         ^

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

你好wodl
          ^

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

  ..........
 ^ <=指向“打印头” 
  /* part1 */ printf("hello worl"); 
 你好
           ^ <=指向“打印头” 
  /* part2 */ printf("\b"); 
 你好
          ^ <=指向“打印头” 
  /* part3 */ printf("\b"); 
 你好
         ^ <=指向“打印头” 
  /* part4 */ printf("d\n"); 
 你好wodl

 ^ <=指向下一行“打印头”的指针 

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

 "\b \b" 

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

不太难解释…这就像打字hello worl ,打左箭头键两次,键入d ,然后敲击向下箭头键。

至less,这是我推断你的terminal是干扰\b\n代码。

将输出redirect到一个文件,我打赌你完全得到了其他东西。 尽pipe您可能需要查看文件的字节才能看到差异。

[编辑]

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

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