下面的演示皆在linux环境下
\n:换行
\r:回车
>当使用 hello world\n时,发现会直接打印出 hello world
为了方便观察 ,使用一个休眠函数sleep,使其休眠1秒,发现最终什么也打印出不来
此时可以清楚的观察到,是先运行printf函数,遇见\r使光标回到该行的开头,然后才被命令提示符覆盖
此时发现结果竟然是先休眠,然后才先出来hello world ,
难道是执行的sleep函数, 再去执行的printf函数吗?
当然不是!
c语言中一定是自上而下运行的,所以一定先执行printf函数,在执行sleep休眠,
由于hello world 没有被刷新,在sleep期间hello world一直保留在缓冲区中,
直到程序结束,系统自动刷新缓冲区,所以在休眠2秒后显示hello world
当我们使用\r 及fflush函数,去实现一个从10开始显示的倒数实现
发现使用%d输出后,printf函数打印出了实际上是以字符的形式体现的,10可以看作是两个字符,而9是一个字符,所以只会替换掉字符1的位置,打印出 9 0 两个字符
所以要使用%2d,覆盖2个字符位置使其右对齐
使用%2d后,使其修改两个字符,若为一个字符时,右对齐
1 myproc: main.c proc.c2 gcc -o myproc main.c proc.c3 .PHONY:clean4 clean:5 rm -f myproc
#include"proc.h"2 #define size 1013 void process()4 {5 char arr[size];6 memset(arr,'\0',sizeof(char)*size);//全部 初始化为'\0'7 char str[]="|/-\\";8 int i=0;9 for(i=0;i<=100;i++)10 {11 arr[i]='#';12 printf("[%-100s][%d%%][%c]\r",arr,i,str[i%4]);13 fflush(stdout);//刷新缓冲区14 usleep(100000);//间隔0.1秒输出15 }16 printf("\n");17 }
#include2 #include//usleep函数3 #include
#include"proc.h"2 int main()3 {4 process();5 return 0; 6 }