1.\r和\n
C语言中有很多字符
a.可显字符
b.控制字符
对于回车其实有两个动作,首先换行,在将光标指向最左侧
\r :回车
\n:换行
下面举个例子:


把\n去掉会怎样


什么都没输出。为什么?
2.缓冲区概念
观察下两个代码的区别


上面的代码会等待3s后才输出,而下面的代码会直接输出。
不加\n好像是先执行了sleep,在执行printf?
并不是!!! 一定是先执行完printf,在执行sleep
Hello Linux没有被刷新,数据一定是在sleep期间被保存起来了,为什么\n,数据就显示出来了呢?
缓冲区有自己的刷新策略,只要看到\n,就会刷新


为什么没有显示Hello Linux 因为\r将光标移到了最左侧,然后显示的Hello Linux被root@ikun test覆盖。光标跟显示器匹配,光标在哪里,显示器就显示在哪里!
倒计时小程序


什么都没有显示
改写,刷新缓冲区


结果是从屏幕上倒计时从9到0
如果从10开始倒计时呢?


3.进度条程序
文件分离

proc.h
#pragma once
#include <stdio.h>
#include"proc.h"
#include<string.h>
#include<unistd.h> //该头文件是Linux下的,windows没有
#define SIZE 101
#define STYLE '='
#define ARR '>'
extern void process();
proc.c
#include "proc.h"
void process()
{
char bar[SIZE];
memset(bar, '\0', sizeof(bar)); //初始化bar
int i = 0;
while (i <= 100)
{
printf("[%-100s][%d%%][%c]\r", bar, i); //-100左对齐,
fflush(stdout); //刷新缓冲区
bar[i++] = STYLE;
if (i != 100)
bar[i] = ARR;
usleep(100000);
}
printf("\n");
}
main.c
#include "proc.h"
int main()
{
process();
return 0;
}
