请问printf中'\n'与'\r'的关系是什么?GCC下输出缓冲为何有此表现?
关于printf中'\r'与'\n'的差异及输出缓冲问题解析
先看两段测试代码:
第一段代码:
#include<stdio.h> int main() { printf ("Hello\r"); }
在GCC编译执行后无任何输出;将printf语句修改为:
printf ("Hello\r\n");
执行后则正常输出Hello。下面针对问题逐一解释:
一、'\n'与'\r'的关系
\r是回车符,功能是把光标移到当前行的开头,不会切换到下一行。\n是换行符,不同系统里的行为略有区别:- 类Unix系统(比如Linux)中,
\n会同时完成光标移到下一行开头(相当于回车+换行); - Windows系统里,需要
\r\n组合才能实现完整的回车换行效果。
- 类Unix系统(比如Linux)中,
二、为何会出现输出差异?
- 第一段代码里,
printf("Hello\r")输出"Hello"后,光标回到行首,但因为没有触发输出缓冲的刷新,程序结束时缓冲区里的内容没被输出到终端,所以看不到任何内容。 - 修改后的代码加入了
\n,在类Unix环境下,\n会触发标准输出的行缓冲刷新机制,把缓冲区里的"Hello"立刻输出到终端,所以能看到正常的输出结果。
三、输出缓冲中发生了什么?
标准输出(stdout)默认采用行缓冲模式,触发缓冲刷新的常见条件有三个:
- 缓冲区被写满;
- 遇到换行符
\n; - 主动调用
fflush(stdout)强制刷新,或者程序正常退出时(但如果没满足前两个条件,程序快速结束可能来不及刷新)。
第一段代码只有\r,不满足行缓冲的刷新触发条件,程序结束前缓冲区内容没被刷到终端,所以无输出;加入\n后,触发了自动刷新,缓冲区里的内容被输出到终端,就能看到"Hello"了。
内容的提问来源于stack exchange,提问作者Baranitharan
相关产品推荐
相关产品推荐

