C语言统计重定向文本文件全局唯一字符数功能如何修复
问题原因
- 字符索引计算错误:你原有代码中
int convToInt = inp[i] - '0'的逻辑仅适用于数字字符,普通字母、换行符等字符减'0'后会出现负数或偏移错误,导致数组越界访问,属于未定义行为。实际上ASCII字符本身的数值范围就是0~127,直接作为数组索引即可。 - 去重状态未全局保留:当前
everyCharValArr是countUniqueChars的局部变量,每次调用函数都会被重新初始化清零,只能统计单次输入的唯一字符,无法跨多行保留全局去重状态。 - 统计逻辑错误:当前是把每行的唯一字符数直接累加,没有做全局去重判断,自然无法得到全局唯一字符总数。
修改方案
把去重统计数组移到main函数作为全局状态,逐字符读取输入标记出现过的字符,全部读取完成后再统一统计总数,不需要额外拆分统计函数逻辑,效率更高也更易维护,还不用考虑单行长度超过缓冲区的问题。
完整可运行代码
#include <stdio.h> #define ASCII_VALS 128 int main() { // 全局去重标记数组,初始全部为0代表未出现 int char_exist[ASCII_VALS] = {0}; int ch; int unique_count = 0; // 逐字符读取直到EOF,适配任意长度的重定向输入 while ((ch = getchar()) != EOF) { // 强转为unsigned char避免负数值越界 char_exist[(unsigned char)ch] = 1; } // 统计所有出现过的字符总数 for (int i = 0; i < ASCII_VALS; i++) { unique_count += char_exist[i]; } printf("%d\n", unique_count); return 0; }
补充说明
如果不需要统计换行符、空格等特殊字符,可以在标记前添加过滤逻辑,示例如下:
// 仅统计大小写字母和数字,过滤换行、空格等特殊字符 if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') || (ch >= '0' && ch <= '9')) { char_exist[(unsigned char)ch] = 1; }
用你给出的测试文件验证:包含换行符时输出结果为17,过滤换行符后输出结果为16,符合全局去重的统计要求。
内容的提问来源于stack exchange,提问作者josef_uncovsky
相关产品推荐
相关产品推荐

