You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 08:54:02