printf()调用是否创建新内部缓冲区?后续调用为何延续前次输出位置?
关于printf()缓冲区与制表符行为的解答
嘿,我来帮你理清这两个关于printf的问题~
1. printf()的内部缓冲区是复用还是每次新建?
答案很明确:所有针对标准输出(stdout)的printf()调用,共享同一个内部缓冲区,不会每次调用都新建。这个缓冲区属于stdout这个流对象,只要你没关闭stdout或者重新打开它,后续的printf都会往同一个缓冲区里写入内容。当然啦,当缓冲区被写满、遇到换行符\n,或者你手动调用fflush(stdout)时,缓冲区里的内容会被“刷新”到终端显示出来。
2. 为什么\t会从前一次printf输出末尾延续对齐?
你观察到的这个现象太正常了——因为终端的光标位置是全局的,和你调用了几次printf完全没关系!
举个实际的代码例子:
printf("Hello"); printf("\tWorld\n");
第一次printf输出"Hello"后,终端的光标会停在o字符的后面;第二次printf里的\t,是根据当前光标所在的列数来计算下一个制表位的,而不是默认从行首开始。这就导致\t会从"Hello"的末尾开始找下一个制表点,而不是你预期的行首位置。
如果想要让每个printf的\t都从行首开始对齐,你只需要在每个printf的开头(或者上一个printf的结尾)加上换行符\n就行,比如改成这样:
printf("Hello\n"); printf("\tWorld\n");
这样第一次输出后光标会跳到下一行的开头,第二次的\t自然就从行首的制表位开始啦。
额外补充个小知识点:默认情况下终端的stdout是行缓冲模式,只有遇到\n、缓冲区满或者程序结束时才会把内容刷到终端。但不管缓冲区有没有刷新,光标位置都是跟着已经输出到终端的内容走的——缓冲区只是决定内容什么时候显示出来,而终端一旦收到内容,就会立刻更新光标位置,后续所有输出都会基于这个位置来排版。
内容的提问来源于stack exchange,提问作者user7183038
相关产品推荐
相关产品推荐

