将模板字符串中的\b处理为C中的printf

将模板字符串中的\b处理为C中的printf,c,terminal,escaping,printf,C,Terminal,Escaping,Printf,有人能给我解释一下或者给我指一个参考资料,解释为什么在第一行下面的代码片段中包含了整个单词hello,而在第二行中它只包含字母he?我以为不管换行符是什么,退格转义字符都会删除最后三个字母。我已经阅读了printf上的GNU文档,但找不到任何相关内容 int main(void) { printf("hello\b\b\b\n"); return 0; } int main(void) { printf("hello\b\b\b"); ret

有人能给我解释一下或者给我指一个参考资料,解释为什么在第一行下面的代码片段中包含了整个单词
hello
,而在第二行中它只包含字母
he
?我以为不管换行符是什么,退格转义字符都会删除最后三个字母。我已经阅读了
printf
上的GNU文档,但找不到任何相关内容

int main(void)
{
    printf("hello\b\b\b\n");        
    return 0;
}



int main(void)
{
    printf("hello\b\b\b");
    return 0;
}

要记住两件关键的事情:

  • 使用
    printf()
    时,控制台的输出不会立即呈现:输出是缓冲的。立即(同步)将输出缓冲区刷新到控制台的两种方法是通过
    printf(“\n”)
    打印换行符,或通过
    fflush(stdout)
    手动刷新缓冲区
  • 如果使用转义序列,将光标向后/向左移动一个“空格”,但打印换行符不一定会清除该行的其余部分。如果要手动打印旧字符(即,
    printf(“Hello\b\b\b\n”)
    )上的新字符,则输出将更符合您的预期
  • 最后,下面的示例应该有助于更好地了解涉及您的问题的典型行为

    #include <stdio.h>
    #include <unistd.h>
    
    #define DELAY   (2) /* seconds */
    
    int main(void)
    {
    
        printf("Example DELAY:\n");
        printf("------------------------------------------------------------------------\n");
        printf("hello\b\b\b\n");
        sleep(DELAY);
        printf("\n\n");
    
        printf("Example 2:\n");
        printf("------------------------------------------------------------------------\n");
        printf("hello\b\b\b");
        sleep(DELAY);
        printf("...");
        sleep(DELAY);
        fflush(stdout);
        sleep(DELAY);
        printf("\n\n");
    
        printf("Example 3:\n");
        printf("------------------------------------------------------------------------\n");
        fflush(stdout);
        printf("hello\b\b\b");
        fflush(stdout);
        sleep(DELAY);
        printf("...");
        sleep(DELAY);
        fflush(stdout);
        sleep(DELAY);
        printf("\n\n");
    
        return 0;
    }
    
    #包括
    #包括
    #定义延迟(2)/*秒*/
    内部主(空)
    {
    printf(“示例延迟:\n”);
    printf(“----------------------------------------------------------------------------------------\n”);
    printf(“hello\b\b\b\n”);
    睡眠(延迟);
    printf(“\n\n”);
    printf(“示例2:\n”);
    printf(“----------------------------------------------------------------------------------------\n”);
    printf(“hello\b\b\b”);
    睡眠(延迟);
    printf(“…”);
    睡眠(延迟);
    fflush(stdout);
    睡眠(延迟);
    printf(“\n\n”);
    printf(“示例3:\n”);
    printf(“----------------------------------------------------------------------------------------\n”);
    fflush(stdout);
    printf(“hello\b\b\b”);
    fflush(stdout);
    睡眠(延迟);
    printf(“…”);
    睡眠(延迟);
    fflush(stdout);
    睡眠(延迟);
    printf(“\n\n”);
    返回0;
    }
    
    要记住两件关键的事情:

  • 使用
    printf()
    时,控制台的输出不会立即呈现:输出是缓冲的。立即(同步)将输出缓冲区刷新到控制台的两种方法是通过
    printf(“\n”)
    打印换行符,或通过
    fflush(stdout)
    手动刷新缓冲区
  • 如果使用转义序列,将光标向后/向左移动一个“空格”,但打印换行符不一定会清除该行的其余部分。如果要手动打印旧字符(即,
    printf(“Hello\b\b\b\n”)
    )上的新字符,则输出将更符合您的预期
  • 最后,下面的示例应该有助于更好地了解涉及您的问题的典型行为

    #include <stdio.h>
    #include <unistd.h>
    
    #define DELAY   (2) /* seconds */
    
    int main(void)
    {
    
        printf("Example DELAY:\n");
        printf("------------------------------------------------------------------------\n");
        printf("hello\b\b\b\n");
        sleep(DELAY);
        printf("\n\n");
    
        printf("Example 2:\n");
        printf("------------------------------------------------------------------------\n");
        printf("hello\b\b\b");
        sleep(DELAY);
        printf("...");
        sleep(DELAY);
        fflush(stdout);
        sleep(DELAY);
        printf("\n\n");
    
        printf("Example 3:\n");
        printf("------------------------------------------------------------------------\n");
        fflush(stdout);
        printf("hello\b\b\b");
        fflush(stdout);
        sleep(DELAY);
        printf("...");
        sleep(DELAY);
        fflush(stdout);
        sleep(DELAY);
        printf("\n\n");
    
        return 0;
    }
    
    #包括
    #包括
    #定义延迟(2)/*秒*/
    内部主(空)
    {
    printf(“示例延迟:\n”);
    printf(“----------------------------------------------------------------------------------------\n”);
    printf(“hello\b\b\b\n”);
    睡眠(延迟);
    printf(“\n\n”);
    printf(“示例2:\n”);
    printf(“----------------------------------------------------------------------------------------\n”);
    printf(“hello\b\b\b”);
    睡眠(延迟);
    printf(“…”);
    睡眠(延迟);
    fflush(stdout);
    睡眠(延迟);
    printf(“\n\n”);
    printf(“示例3:\n”);
    printf(“----------------------------------------------------------------------------------------\n”);
    fflush(stdout);
    printf(“hello\b\b\b”);
    fflush(stdout);
    睡眠(延迟);
    printf(“…”);
    睡眠(延迟);
    fflush(stdout);
    睡眠(延迟);
    printf(“\n\n”);
    返回0;
    }
    
    这不是关于C或printf的问题。在每种情况下,代码都完全按照它所说的那样执行:在第一个示例中,它输出9个字符
    h e l o\b\b\n
    ,在第二个示例中,它同样输出8个字符。如果您将标准输出写入一个文件,则该文件将包含该标准输出。但是,如果您向终端写入,您的终端可能会通过退格处理
    \b
    ,因此您的问题实际上是关于您的终端的。你还没有说你在用什么终端

    退格字符的一种常见行为方式是将光标向左移动一个位置,但实际上不删除该位置的字符。下一个字符输出将被写入其中

    在第一个示例中,您将光标移回第一个
    l
    ,但之后再也不会在其上或任何其他字符上写入任何内容。然后
    \n
    不会更改屏幕上的任何字符,只会将光标移动到下一行。因此,您仍然可以在前一行中看到
    hello


    在第二个示例中,当程序终止时,光标留在第一个
    l
    上。因此,下一个向终端写入输出的程序将写入该字符(除非下一个程序的第一次写入是
    \n
    或类似的内容)。下一个程序可能是您的shell,因此shell提示符中的字符可能会覆盖
    llo
    ,因此您看不到它们。

    这实际上不是关于C或printf的问题。在每种情况下,代码都完全按照它所说的那样执行:在第一个示例中,它输出9个字符
    h e l o\b\b\n
    ,在第二个示例中,它同样输出8个字符。如果您将标准输出写入一个文件,则该文件将包含该标准输出。但是,如果您向终端写入,您的终端可能会通过退格处理
    \b
    ,因此您的问题实际上是关于您的终端的。你还没有说你在用什么终端

    退格字符的一种常见行为方式是将光标向左移动一个位置,但实际上不会删除该p中的字符