先来看段代码:
//test.c
#include
#include
int main(void)
{
printf("hello world\n");
sleep(3);
return 0;
}
正常情况下,屏幕上首先会输出"hello world",然后等待3秒后才出现命令提示符,是这样吗?
显然是这样的!
接着看下面的代码://test.c
#include
#include
int main(void)
{
printf("hello world");
sleep(3);
return 0;
}
好像没什么不同,仔细看,"hello world" 后面少了一个 "\n",这段代码的运行结果是什么呢?
3秒过后。。。
通过结果可以发现,程序先执行了 sleep(3),休眠3秒后再输出"hello world"
这是什么原因呢?
,会不会就是'\n' 的原因呢?
不完全是!原因如下:
很简单,stdout(标准输出)的缓冲区是需要刷新的,当程序执行到 printf() 函数时,系统会先将输出内容暂存到缓冲区中,直到以下几种情况出现时,才会刷缓冲区,从而输出到控制台:
遇到 '\n' (换行符)时刷新
缓冲区满的时候刷新
程序结束时刷新
调用scanf()时刷新
下面简单说一下 '\n' 与 '\r' (注意:这两个是字符,因此要用单引号)
'\n'(0x0a=10):换行符,将光标移动到下一行,但并不是行首
(如果只换行,打印的东西会在下一行的先一个位置继续。)
'\r'(0x0d=13):回车符,将光标移动到最左侧即行首
如果只回车,打印的东西会覆盖同行以前的内容。
在linux下的回车键只代表\n
在windows下的回车键表示\r\n
下面写一个简单程序:模拟进度条
#include
#include
#include
void proc()
{
char a[102];
char b[4]={'|','/','-','\\'};
memset(a,'\0',sizeof(a));
int i = 0;
while(i<101)
{
a[i] = '=';
printf("[%-101s][%d%][%c]\r",a ,i++,b[i%4]);
fflush(stdout);
usleep(100000);
}
printf("\n");
}
int main()
{
proc();
return 0;
}
现在大家应该很容易理解上面的代码了吧
程序运行结果如下:
进度增长中。。。
进度完成
(说明:进度条最右边会有一个滚动的光标哦
)