C - puts() 与 printf() 使用 \b

C - puts() vs. printf() using \b

printf("backspace\b");

输出:backspac

puts("backspace\b");

输出:退格

这是为什么?因为 puts() 添加了一个终止换行符并且 \b 因此没有效果?

看起来它们都将光标向后移动了一个位置,但是 puts() 在单词的末尾附加了一个换行符,因此如果您尝试覆盖当前光标,您实际上并没有擦除 'e', 因为光标已经落到下一行了

正如评论中有人所说,代码示例会给出更准确和正确的答案。

编辑:从评论来看,似乎将光标向后移动然后打印字符会覆盖单词,除非该字符是换行符,否则不会。

printf("backspace\b\n "); // Output: backspace

printf("backspace\b"); // Output: backspac|e (| for cursor)

printf("backspace\b "); // Output: backspac
printf("backspace\b");

在典型的终端或模拟器上,这将打印字符串 backspace,然后将光标移回一个位置,将其留在最后的 e 之上。如果您看到 backspac,那是因为在 printf 调用之后有其他东西破坏了 e,要么是因为同一个程序打印了更多输出(您没有向我们展示),要么是因为程序完成后发生了一些事情。如果 printf 是你程序中唯一的语句,而你 运行 在类 Unix shell 中运行,那么 shell 提示符可能会破坏 e.

puts("backspace\b");

puts 函数将换行符 '\n' 添加到其输出。这相当于

printf("backspace\b\n");

与前面的示例一样,\b 会使光标向后移动一个位置,在 e 的顶部,但随后 \n' 会使其移动到下一行的开头,不会破坏 e.

在这两种情况下,退格字符 '\b' 都会写入标准输出。如果您 运行 您的程序将输出重定向到一个文件,然后检查该文件,您会看到它,可能显示为十六进制的 ^H08,具体取决于您的查看方式它。