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

C语言实现数字频率统计时大输入场景结果错误问题求解

代码问题分析

你的代码存在两个核心错误,直接导致长字符串输入时计数结果不符合预期:

  • 未过滤非数字字符,存在数组越界访问
    你的逻辑默认输入的所有字符都是数字,直接用s[index++] - 48的结果作为下标访问长度为10的count数组。但输入字符串中包含大量字母等非数字字符,这类字符减去48后得到的数值不在0~9范围内,越界访问数组属于未定义行为,会篡改内存中的计数数据,导致结果错误。
  • 输入缓冲区长度不足,存在缓冲区溢出
    你定义的字符数组s长度仅为1000,最多只能存储999个有效字符(需要预留1位存储字符串结束符\0)。你提供的测试长字符串的长度已经超过999,用scanf("%s", s)读取时会发生缓冲区溢出,覆盖栈上其他内存区域的内容,进一步引发计数异常。
修正后代码
#include <stdio.h>
#include <string.h>
#include <ctype.h> // 引入isdigit函数判断字符是否为数字

int main() {
    // 扩大缓冲区长度,足够容纳测试字符串
    char s[2048];
    scanf("%s", s);
    int len = strlen(s);
    int count[10] = {0};
    
    for(int index = 0; index < len; index++){
        // 仅对数字字符做计数处理
        if(isdigit(s[index])){
            count[s[index] - '0']++; // 用'0'代替48,可读性更强,兼容不同字符集
        }
    }
    
    for(int i = 0; i < 10; i++)
       printf("%d ", count[i]);
    
    return 0;
}

内容的提问来源于stack exchange,提问作者Aftab Shaikh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 05:00:01