#include <stdio.h>
int main()
{
printf("\tfirst\b\b\bsh\\\r\'No.1\'");
}
一些转义字符的含义:
\b退格键,将光标向左退一格,将并原位置上的内容擦除(包含输出显示与缓冲区)
\r将光标置在所在行的最前面,将所在显示行的内容全擦除(只包含输出显示)
\t一般情况下按一次输出8个空格,但有的编译器输出为4个。
(一般标准输入输出都是带有缓存的,一般是行缓存。对于标准输出,需要输出的数据并不是直接输出到终端上,而是首先缓存到某个地方,当遇到行刷新标志或者该缓存已满的情况下,再把缓存的数据显示到终端设备上。ANSI C中定义换行符'\n'可以认为是行刷新标志。所以,printf函数如果没有带'\n'是不会自动刷新输出流,直至缓存被填满。如果既没\n也未填满,则当系统扫描完串中的内容后,也就是""中的内容,系统下一步不会去刷新缓冲区)
按照上面的理解:对printf("\tfirst\b\b\bsh\\\r\'No.1\'\n");进行解析:
第一步:printf("\t");标准输出内容显示为:8个空格,输出缓冲区中的内容:8个空格
第二步:printf("\tfirst");标准输出内容显示为:8个空格first,输出缓冲区中的内容:8个空格first
第三步:printf("\tfirst\b\b\b");标准输出内容显示为:8个空格fi,输出缓冲区中的内容:8个空格fi
第四步:printf("\tfirst\b\b\bsh");标准输出内容显示为:8个空格fish,输出缓冲区中的内容:8个空格fish
第五步:printf("\tfirst\b\b\bsh\\");标准输出内容显示为:8个空格fish\,输出缓冲区中的内容:8个空格fish\
第六步:printf("\tfirst\b\b\bsh\\\r");标准输出内容显示为:空,输出缓冲区中的内容:8个空格fish\
第七步:printf("\tfirst\b\b\bsh\\\r\'No.1'");标准输出内容显示为:'No.1',输出缓冲区中的内容:'No.1'两个空格fish\(原8个空格已被'No.1'占去6个,所以只剩2个)
第八步:printf("\tfirst\b\b\bsh\\\r\'No.1'\n");标准输出内容显示为:'No.1'
fish\,输出缓冲区中的内容:'No.1'
fish\(这里遇到了\n换行符,所以系统对输出缓冲区进行了强制刷新,将里面的内容都输出)
如果没有\n,则不会强制刷新输出缓冲区,所以只会看到最新(最后)写入的数据,也就是'No.1',原
两个空格fish\不会被刷新输出。