在老式键盘上,回车键是这样的形状
但是该键的功能它不仅仅是回车,而是回车换行!
这里需要明白两个概念:
回车:光标移动到当前行的行首
换行:光标移动到当前位置的下一行
在C语言中,\r表示回车,而\n表示回车换行!
做个测试:
上面的第一张图,代码里写了两句输出函数,但是结果只显示了world,这是为什么?
因为,我们的输出函数虽然会往屏幕上打印内容,但是该内容并不是立马执行到该语句就会打印的,而是printf函数会将内容先送往缓冲区,然后缓冲区里的内容在遇到一些标志的时候才会将该内容往屏幕上打印。
上面第一张图,代码输出hello后紧接着又输出了\r
,而此时若再不将缓冲区里的hello输出到屏幕中,那么当再有内容往缓冲区送时hello\r会和该内容一起往屏幕打印,在往屏幕打印的过程中,输出完hello后\r会将光标移动到行首h处,之后的内容将会从行首处开始往屏幕打印,导致覆盖掉hello,所以最终只会输出world。
看下图能容易理解
那么有什么办法能够使缓冲区里的内容及时往屏幕打印呢?
\n可以,但会导致光标回车换行。
这里有一个fflush函数,该函数可以使缓冲区里的内容及时往屏幕上打印。
但这里要注意一点:该函数仅是刷新缓冲区里的内容往屏幕上打印,并不会解决\r之后会被覆盖的问题,该函数使得我们能够观察到hello输出到屏幕上,但无法解决hello会被world或者xxx覆盖的问题!
由于程序运行的速度非常的快,所以我们在输出xxx之前用休眠函数先休眠10秒钟,这样我们就能够观察到hello输出的过程,当休眠结束后,xxx会从h处开始输出。
编写进度条的思想是:第一次输出一个#,第二次输出两个#,第三次输出三个#,……,每次输出都输出在同一行,这样就达到了进度条的效果!
为了使进度条更加美观,我们在进度条后面可以加上百分比和旋转小图标
#include
#include
int main()
{
char bar[101] = { '\0' };
char* label = "-\\|/";
for(int i = 0; i <= 100; ++i)
{
printf("[%-100s][%d%%][%c]\r", bar, i, label[i % 4]);
bar[i] = '#';
fflush(stdout);
usleep(100000);
}
printf("\n");
return 0;
}