【问题标题】:backspace \b does not work before \n in C format string [duplicate]退格 \b 在 C 格式字符串中的 \n 之前不起作用 [重复]
【发布时间】:2023-04-07 15:11:02
【问题描述】:

忽略换行符之前字符串末尾的 C 字符串中的退格转义字符(在 Mac OS X 终端中)。

printf("hello, worl\bd"); // => hello word (OK)
printf("hello, world\b"); // => hello worl (OK)
printf("hello, world\b\n"); // => hello world\n (Why not hello worl\n ?)

为什么会这样?

【问题讨论】:

  • 最好的解释请看这里:stackoverflow.com/a/6792880/2710409
  • @Joshpbarron - 感谢您的链接 - 我理解该链接示例中的行为,但在我的示例中,最后一行,\b 的存在似乎没有任何效果 - 也不应该“你好,世界\nd”还是“你好,世界\n”?
  • 这已在实际答案中进行了解释,但只是为了完整性: \b 将光标向后移动一个字符,但不写任何内容。然后新行向下移动一行。我目前无法对此进行测试,但如果您使用 \r 而不是 \n,您可能会像预期的那样丢失 d。
  • @Joshpbarron :使用 \r 而不是 \n 删除(即不输出)整个字符串。

标签: c string format-string


【解决方案1】:

如果您使用\n\b,它可以随心所欲。就目前而言,它可能会引发更多问题。 C99,§5.2.2/2 字符显示语义:

\b (退格) 将活动位置移动到当前行的前一个位置。如果 活动位置是在一行的初始位置,显示的行为 设备未指定。

由于它只指定移动“活动位置”,我猜它实际上并没有义务擦除任何东西。

【讨论】:

    【解决方案2】:

    \b 只会将光标向后移动一个字符,但不会删除那里的字符。而printf 将打印出从开始到当前光标所在位置的所有内容。

    【讨论】:

    • printf 将打印比光标更多的内容,“hello world”已经打印,当出现 \b 时,光标移动到最后一个 'd' 的前面。之后写入换行符,将光标移动到下一行的开头,但上一行的最后一个 'd' 已经写入上一行 - (它不会移动到下一行,只有光标是。)
    • @nos,我的意思是一样的。光标已移至下一行,则打印出下一行以上的所有内容。
    猜你喜欢
    • 2020-04-08
    • 1970-01-01
    • 1970-01-01
    • 2011-07-22
    • 2016-04-13
    • 2016-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多