有两个程序,它们得到不同的结果,但是我不明白为什么。 这是第一个:
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。
答案 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:
这次,4
和5
仍然可见。
仅使用退格键并不会擦除以前的内容; 仅将写入位置放在屏幕后方一个位置即可。如果要擦除那里的内容,则需要输出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上进行测试。