C语言中putchar无法打印最后一个字符问题求助
解决putchar最后一行无法打印的问题
这其实是标准输出行缓冲机制在搞鬼!我来给你拆解一下:
首先,C语言里的stdout(也就是putchar默认的输出目标)默认是行缓冲模式。简单说就是:你输出的内容会先暂存在内存的缓冲区里,只有满足以下三个条件之一时,才会真正把内容显示到终端上:
- 输出中遇到换行符
\n - 缓冲区被写满(通常是几千字节,单个字符肯定触发不了)
- 程序正常结束(比如
main函数返回、调用exit)
看你的代码片段:
else if(R5 == 0x2B) // PLUS { ..... if(R8 >= 10 || R8 == 0) { R5 = 0; zhnr: if(R8 >= 10) { R8 = R8 - 10; R5++; goto zhnr; } putchar('0'+ R5); } putchar('0'+ R8); // 这是无法打印的最后一个putchar // 若在此添加:putchar('\n'); 即可正常工作 }
最后那个putchar('0'+ R8)执行后,字符被存在缓冲区里,但没有触发任何刷新条件——既没有换行,程序可能还在运行(没到结束节点),缓冲区也没满,所以终端上看不到内容。而当你加上putchar('\n')时,换行符直接触发了行缓冲的刷新,缓冲区里的所有内容(包括之前的那个字符和换行)就一起输出了。
解决办法
你有几个可选方案:
- 方案1:保留换行符(就是你已经发现的方法),简单直接,适合本身就需要换行的场景。
- 方案2:手动刷新缓冲区,在最后那个
putchar之后调用fflush(stdout),强制把缓冲区内容输出到终端:
这个方案适合不需要换行的场景,比如你要在同一行持续输出内容。putchar('0'+ R8); fflush(stdout); // 手动触发输出刷新 - 方案3:修改缓冲模式(不推荐随意使用),如果你的场景确实需要无缓冲输出,可以在程序开头设置
stdout为无缓冲:
但这种做法会降低输出效率,除非特殊需求,优先用前两种方案。#include <stdio.h> int main() { setvbuf(stdout, NULL, _IONBF, 0); // 关闭stdout的缓冲机制 // 你的其他代码逻辑... }
内容的提问来源于stack exchange,提问作者zwerg4
相关产品推荐
相关产品推荐

