You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

C语言字符串数字频率统计代码大输入异常问题排查

问题分析与修复

嘿,我一眼就瞅出你代码里的问题了——是数组下标越界搞的鬼,这也是大输入时结果乱掉的根本原因!

错误点拆解

你定义的统计数组int arr[10];只有10个元素,合法的下标范围是09(刚好对应数字0-9的统计位置)。但你在初始化和统计的时候,居然用了字符的ASCII值(4857,也就是字符'0''9'的ASCII码)当数组下标:

// 初始化时直接越界访问arr[48]到arr[57],这根本不在数组范围内!
for(int i=48;i<=57;i++){
    arr[i]=0;
}
// 统计时同样越界,把数字字符的ASCII值直接当下标用
arr[a[j]]++;

这种操作会直接踩进数组arr之外的内存区域,破坏其他变量的存储(比如strlen(a)的计算结果、循环变量j的值等等)。小输入时可能碰巧没碰坏关键数据,大输入时内存冲突就彻底爆发了,输出自然全乱。

修复后的代码

只需要把字符转成对应的数字下标就行——用字符减去'0',就能把'0'-'9'转换成0-9的合法下标,完美匹配数组的范围。修正后的代码如下:

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

int main() {
    char a[1001];
    scanf("%s",a);
    int arr[10];
    // 用0-9的合法下标初始化统计数组
    for(int i=0;i<10;i++){
        arr[i]=0;
    }
    int j=0;
    int len = strlen(a); // 提前存字符串长度,避免每次循环都计算
    while(j<len){
        if(a[j]>='0' && a[j]<='9'){
            // 把字符转成对应数字下标:a[j] - '0'
            arr[a[j] - '0']++;
        }
        j++;
    }
    // 遍历0-9下标输出统计结果
    for(int i=0;i<10;i++){
        printf("%d ",arr[i]);
    }
    return 0;
}

额外小优化

我还加了个小细节:提前把字符串长度存在len里,避免每次while循环都调用strlen(a)(这个函数每次都会遍历整个字符串,大输入下会拖慢效率)。另外别忘了包含string.h头文件,不然strlen可能会有未定义行为哦。

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

火山引擎 最新活动