函数printf()打印退格问题

时间:2018-09-27 06:05:06

标签: c printf

有两个程序,它们得到不同的结果,但是我不明白为什么。 这是第一个:

int main()
{
    printf("12345");
    fflush(stdout);
    printf("\b\b");
    fflush(stdout);
    return 0;
}

结果是:123。 然后是第二个:

int main()
{
    printf("12345");
    fflush(stdout);
    sleep(1);
    printf("\b\b");
    fflush(stdout);
    return 0;
}

但结果是:12345

为什么当我期望“ 123”结果时,sleep调用会使第二个结果有所不同? 该代码在CLion中运行。 如果需要的话,我的操作系统是macOS。

3 个答案:

答案 0 :(得分:1)

您的代码首先显示“ 12345”,然后显示“ 123”。如果没有sleep,则显示“ 12345”的时间太短而看不到。使用sleep,您可以在删除“ 4”和“ 5”之前看到“ 12345”大约一秒钟。

答案 1 :(得分:1)

根据终端,'\b'可能会“擦除”一个字符或仅将光标移到左侧。要获得万无一失的解决方案,请使用:

#include <unistd.h>
#include <stdio.h>

int main(void)
{
    printf("12345");
    fflush(stdout);
    sleep(1);
    printf("\b\b  \b\b");
    fflush(stdout);
}

答案 2 :(得分:1)

使用原始代码(称为bs97,是从bs97.c编译的),并使用命令行提示符Osiris JL:,我得到了输出:

Osiris JL: bs97
123Osiris JL:

请注意,新提示已覆盖45。您可以看到,如果在第二个putchar('\n');之后添加fflush()。 (我为void添加了int main(void),以避免使用默认的编译选项进行编译警告(错误)。)

Osiris JL: make bs97 && bs97
    gcc -O3 -g -std=c11 -Wall -Wextra -Werror -Wmissing-prototypes -Wstrict-prototypes bs97.c -o bs97
12345
Osiris JL: 

这次,45仍然可见。

仅使用退格键并不会擦除以前的内容; 仅将写入位置放在屏幕后方一个位置即可。如果要擦除那里的内容,则需要输出printf("\b \b\b \b")以返回,输出空格并再次返回-重复两次。或者,您可以使用printf("\b\b "),但这将在两个空格之后保留写位置。或者您可以使用printf("\b\b \b\b")离开3之后的写位置。这个主题还有其他变化。

在第二个程序进入睡眠状态时,我会得到类似的行为,除了12345在程序进入睡眠状态时显示。

我正在使用自制的GCC 8.2.0或XCode 10.0的clang编译器在运行macOS 10.14 Mojave的Mac上进行测试。