【问题标题】:The "backspace" escape character '\b': unexpected behavior?“退格”转义字符 '\b':意外行为?
【发布时间】:2011-10-11 04:35:49
【问题描述】:

所以我终于通读了K&R,在前几页中我学到了一些东西,有一个退格转义字符\b

所以我去测试一下,有一些很奇怪的行为:

#include <stdio.h>

main ()
{
    printf("hello worl\b\bd\n");
}

输出是

hello wodl

谁能解释一下?

【问题讨论】:

    标签: c language-agnostic printf special-characters backspace


    【解决方案1】:

    您的结果会因您使用的终端或控制台程序类型而异,但是是的,在大多数情况下,\b 是一个 非破坏性 退格键。它向后移动光标,但不会擦除那里的内容。

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

    你好世界 ^

    ...(^ 显示光标所在的位置)然后它输出两个 \b 字符,将光标向后移动两个位置而不擦除(在您的终端上):

    你好世界 ^

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

    你好世界 ^

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

    【讨论】:

    • 如果它不擦除那为什么“r”消失了?
    • @cesoid: “您的结果会因您使用的终端或控制台程序类型而异”
    • @cesoid r 被替换为 d。解释仍然合适。
    • @syockit 谢谢。我没有意识到光标在字符“上”。我一直在考虑文字处理器,它们将其显示在“字符之间”(或始终插入而不是覆盖的终端窗口)。编辑后的解释清楚地说明了这一点。
    • @cesoid:对终端很感兴趣。在 Windows 中,cmd.execommand.com 终端并不总是插入(您可以使用 Ins 键来切换行为)。我惊讶地发现我的主要 *nix 计算机上的 Gnome 终端总是插入,甚至似乎没有偏好它,更不用说基于 Ins 键的切换。以前从未注意到这一点。显然,我几乎从不想要打字。 :-)
    【解决方案2】:
    ....... ^
                /* part1 */
                printf("hello worl");
    
    你好,世界
              ^ 
    
    
                /* part2 */
                printf("\b");
    
    你好,世界
             ^ 
    
    
                /* part3 */
                printf("\b");
    
    你好,世界
            ^ 
    
    
                /* part4 */
                printf("d\n");
    
    你好世界
    
    ^ 
        

    【讨论】:

    • 如果第4部分之后的光标在'l'字母处,不应该用'\n'代替吗? (导致“hello wor”)
    • @lucas_turci:问题是'\n' 在屏幕上没有表示。已经存在的东西保持不变;不被空格或任何其他字符表示替换。
    【解决方案3】:

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

    "\b \b"
    

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

    【讨论】:

    • 这仍然留下空格字符不是吗?
    • 嗯,是的,但是随后的\b 将意味着下一个输出字符将覆盖它。
    • 如果后面没有没有个字符怎么办?
    • 那没关系吧?
    • 嗯。除非您的设备实现“删除最后一个字符”选项(例如 DEL / 0x7f),否则我很难过。
    【解决方案4】:

    不太难解释...这就像输入hello worl,按两次左箭头键,输入d,然后按下箭头键。

    至少,这就是我推断您的终端正在与\b\n 代码进行交互的方式。

    将输出重定向到一个文件,我敢打赌你会得到完全不同的东西。虽然您可能需要查看文件的字节才能看到差异。

    [编辑]

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

      • “你好 wod\n”?这是什么意思?
      • 回答者只想展示如何产生 OP 预期的行为。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-09
      相关资源
      最近更新 更多