为什么C语言printf输出long类型值搭配换行符时会产生垃圾值?
问题诊断:统计字符程序输出额外D字符的原因
你遇到的问题和字符串缺少\0空终止符完全无关,你的代码中没有涉及字符串输出操作,printf输出的是long类型的数值,不存在字符串终止符的相关问题。
根本原因
额外出现的字母D不是你的程序输出的内容,是终端控制字符回显的残留:
- 类Unix系统的终端默认会将
Ctrl+D这个控制输入回显为^D - 你输入
abc后没有按换行,直接按下Ctrl+D发送EOF时,终端先输出了^D,紧接着你的程序输出的3刚好覆盖了^字符,剩下的D就留在了3的后方,看起来就像是程序输出了3D
验证方法
你可以通过两种方式验证这个结论:
- 输入
abc后先按下回车键,再按Ctrl+D发送EOF,此时程序输出只会显示3,不会出现额外的D - 修改代码的输出语句为
printf("统计结果:%ld\n", nc);,你会看到D字符会出现在整行输出的最前方,明显不属于程序的输出内容
代码优化建议
你目前的代码使用的是旧版C语法,建议按照C标准调整main函数的写法,避免在新编译器下出现警告:
#include <stdio.h> int main() { int c; long nc = 0; while ((c = getchar()) != EOF) { if (c == '\n') { continue; } ++nc; } printf("%ld\n", nc); return 0; }
内容的提问来源于stack exchange,提问作者Alan
相关产品推荐
相关产品推荐

