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

数字频率统计程序代码故障排查:请求分析代码失效原因

代码失效原因分析及修复方案

你的代码存在三个关键问题,导致无法正常运行:

  • 缓冲区溢出风险
    定义的字符串数组str长度为100,但调用fgets时传入的最大读取长度是1000。当输入字符串长度超过99(需留一个位置存终止符'\0'),会直接超出数组边界,破坏内存数据,引发程序崩溃或异常行为。
    修复:将fgets的第二个参数改为sizeof(str)或直接写100,确保读取字符数不超过数组容量:

    fgets(str, sizeof(str), stdin);
    
  • 数组下标访问错误
    sum数组的合法下标范围是0-9,对应数字0-9的统计,但你直接用字符str[i]作为下标。比如字符'0'的ASCII码是48,sum[str[i]]实际访问的是sum[48],远远超出数组合法范围,导致内存越界,统计结果完全错误。
    修复:将字符转换为对应数字,只需减去字符'0'的ASCII值:

    sum[str[i] - '0']++;
    
  • 未处理换行符(可选优化)
    fgets会把输入末尾的换行符\n读取到字符串中,虽然isdigit会过滤它,但会让strlen的结果多算一个字符。可以在读取后手动去掉换行符:

    str[strcspn(str, "\n")] = '\0';
    

修复后的完整代码

#include <stdio.h>
#include <string.h>
#include <ctype.h>

int main() {
    char str[100];
    fgets(str, sizeof(str), stdin);
    // 去掉换行符
    str[strcspn(str, "\n")] = '\0';
    int n = strlen(str);
    int sum[10] = {0};
    int i;
    for(i = 0; i < n; i++){
        if(isdigit(str[i])){
            sum[str[i] - '0']++;
        }
    }

    for(i = 0; i < 10; i++){
        printf("%d ", sum[i]);
    }
    return 0;
}

内容的提问来源于stack exchange,提问作者Krrish Gupta

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 07:12:08