C语言getchar循环后printf输出异常求助(K&R习题1-13)
《C程序设计语言》习题1-13问题排查
核心问题可能的几个方向
- 统计逻辑漏执行
要么输入结束的判断写错了(比如没处理EOF,或者循环条件直接不成立),导致整个统计代码块根本没跑;要么单词结束时的统计步骤缺失——比如遇到空格/换行时,只重置了当前单词长度计数器,没把长度值更新到统计数组里。 - 数组操作错误
统计单词数量的数组没初始化全0,或者索引计算错了(比如用长度值直接当索引,导致越界或者只修改了第一个元素);还有可能输出时只遍历了数组的第一个元素,所以只打出一个0。 - 收尾逻辑缺失
输入结束时如果最后一个单词后面没有空白字符,这个单词的长度根本没被统计进去,直接导致结果不全。
修正后的参考代码
#include <stdio.h> int main() { int curr_len = 0; // 假设统计1-10字符长度的单词,数组初始化全0 int len_counts[10] = {0}; int input_char; // 循环读取直到输入结束 while ((input_char = getchar()) != EOF) { if (input_char != ' ' && input_char != '\n' && input_char != '\t') { curr_len++; } else { // 仅当当前有有效单词长度时统计 if (curr_len > 0 && curr_len <= 10) { len_counts[curr_len - 1]++; curr_len = 0; } } } // 处理输入结束时未统计的最后一个单词 if (curr_len > 0 && curr_len <= 10) { len_counts[curr_len - 1]++; } printf("RESULTS:\n"); // 遍历输出所有长度的统计结果 for (int i = 0; i < 10; i++) { printf("单词长度%d: %d\n", i + 1, len_counts[i]); } return 0; }
必查验证点
- 输入结束要按对应系统的EOF组合键(Windows是Ctrl+Z,Linux/macOS是Ctrl+D),确保程序触发统计收尾
- 检查统计数组的索引是否对应正确:比如长度1的单词对应数组下标0,避免越界或错位
- 输出循环要覆盖所有你要统计的长度范围,别只循环一次输出第一个元素
内容的提问来源于stack exchange,提问作者最白目
相关产品推荐
相关产品推荐

