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

时间:2017-07-02 21:49:08

标签: c terminal escaping printf

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

printf

2 个答案:

答案 0 :(得分:3)

要记住两个关键事项:

  1. 使用printf()时,不立即呈现输出到控制台:输出被缓冲。将输出缓冲区立即(同步)刷新到控制台的两种方法是通过printf("\n")打印换行符,或通过fflush(stdout)手动刷新缓冲区。
  2. 如果您使用\b转义序列,则会将光标移动一个"空格"向后/向左,但打印换行符不一定能清除该行的其余部分。如果您要在旧字符上手动打印新字符(即printf("Hello\b\b\b \n")),则输出将更像您期望的内容。
  3. asciicast

    Additionally, if you want to do some advanced command-line menus, graphics, etc, you'll need to use something like libncurses.

    最后,以下示例应该有助于更好地了解涉及您问题的典型行为。

    #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;
    }
    

答案 1 :(得分:1)

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

退格字符的一种常见方式是将光标向左移动一个位置,但实际上不会删除该位置的字符。下一个字符输出将写在它上面。

在你的第一个例子中,你将光标移回第一个l,但是你永远不会在它上面写任何东西或任何其他角色。然后\n不会更改屏幕上的任何字符,只是将光标移动到下一行。所以你仍然在前一行看到hello

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