C程序统计文本文件ASCII字符数无输出,求代码修复方案
ASCII字符统计代码修复方案
核心问题:无输出的直接原因
原代码仅完成了字符计数逻辑,但完全没有编写统计结果输出代码,这是终端无任何输出的根本原因。
关键BUG修复
- 错误使用
char存储输入字符:EOF是int类型(值为-1),若char为有符号类型,读取到ASCII值0xFF的字符时会被解析为-1,与EOF混淆导致循环提前终止。需将gettingChar类型改为int。 - 初始读取未判断EOF:若输入文件为空,第一次
scanf读取失败后,gettingChar值未定义,直接用作数组下标会触发越界错误。 - 循环内EOF判断逻辑错误:
scanf("%c", &gettingChar)的返回值才是判断读取是否成功的可靠依据(成功返回1,遇EOF返回EOF),直接判断gettingChar == EOF不可靠,因为scanf失败时gettingChar值不会更新。
修复后的完整代码
#include <stdio.h> int main() { int myAsciiList[128] = {0}; // 初始化所有ASCII字符计数为0 int gettingChar; // 用int类型存储,兼容EOF判断 // 逐个读取字符,直到遇到EOF while ((gettingChar = getchar()) != EOF) { // 仅统计标准ASCII字符(0-127),避免数组越界 if (gettingChar >= 0 && gettingChar < 128) { myAsciiList[gettingChar]++; } } // 输出统计结果 for (int i = 0; i < 128; i++) { if (myAsciiList[i] > 0) { // 区分可打印字符与不可打印字符的输出格式 if (i >= 32 && i <= 126) { printf("字符 '%c' (ASCII: %d) 出现次数: %d\n", i, i, myAsciiList[i]); } else { printf("ASCII: %d 出现次数: %d\n", i, myAsciiList[i]); } } } return 0; }
额外优化说明
- 用
getchar()替代scanf,更适合逐个读取字符,代码更简洁高效。 - 添加ASCII范围校验,避免非标准ASCII字符导致数组越界。
- 优化输出格式,区分可打印/不可打印字符,结果可读性更强。
内容的提问来源于stack exchange,提问作者SeungWan
相关产品推荐
相关产品推荐

