【问题标题】:C - puts() vs. printf() using \bC - puts() 与 printf() 使用 \b
【发布时间】:2015-12-13 19:58:49
【问题描述】:
printf("backspace\b");

输出:退格

puts("backspace\b");

输出:退格

这是为什么?因为puts() 添加了一个终止换行符,所以\b 无效?

【问题讨论】:

  • \b 只将光标向左移动一个字符,通常不会删除一个字符。因此,其效果取决于您接下来输出的内容。你能提供一个minimal reproducible example吗?
  • #include int main(int argc, char *argv[]) { puts("Hello world\b"); printf("你好世界\b");返回0; }
  • 如果你printf("Hello world\b\n");怎么办?
  • #include int main(int argc, char *argv[]) { printf("Hello world\b\n");返回0; } 结果是“Hello world”。
  • 当你puts("Hello world\b ") 时会发生什么?注意最后的空格。在您打印另一个字符之前,退格有时非破坏性

标签: c printf puts


【解决方案1】:
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' 都会写入标准输出。如果您运行程序并将输出重定向到一个文件,然后检查该文件,您会看到它,可能显示为 ^H 或十六进制的 08,具体取决于您如何查看它。

【讨论】:

    【解决方案2】:

    看起来他们都将光标向后移动了一个位置,但是 puts() 在单词的末尾附加了一个换行符,所以如果你尝试覆盖当前光标,你实际上并没有删除“e”,因为光标已移至下一行。

    就像有人在 cmets 中所说,代码示例会给出更准确和正确的答案。

    编辑:从 cmets 来看,看起来就像将光标移回然后打印一个字符会覆盖单词,除非该字符是换行符,否则不会。

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

    【讨论】:

    • 但是 printf("backspace\b"); 的输出不是退格|e(| 表示光标)而是退格。
    • @Andreas “backspac”之后是什么?您的提示是否覆盖了“e”?
    猜你喜欢
    • 2013-01-18
    • 2015-01-06
    • 1970-01-01
    • 2011-01-28
    • 2021-12-01
    • 2021-11-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多