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

为何统计字符串字母出现次数的C++代码触发SIGABRT错误

错误原因分析
  • 核心触发原因是数组越界访问:你定义的数组x长度仅为26,仅能覆盖下标0~25的取值范围。如果输入的字符串a中包含非小写英文字母的字符(比如大写字母、数字、特殊符号、空格等),执行j = a[i] - 'a'时得到的j值会超出0~25的合法范围,此时访问x[j]就属于非法越界访问内存,这类行为触发系统内存保护机制后就会抛出SIGABRT信号终止程序。
  • 次要排查方向:如果确认输入的a全部由小写字母组成,可检查运行环境的输入流是否存在异常,比如输入内容长度超出当前环境string类型的默认分配上限,不过这种场景出现概率极低。
修复方案

你可以在访问数组前先对字符合法性做校验,避免越界:

for(i=0;i<a.size();i++)
{
    // 仅处理小写字母字符,跳过其他内容
    if (a[i] >= 'a' && a[i] <= 'z') {
        j = a[i] - 'a';
        x[j]++;
    }
}

如果需要同时支持统计大写字母,可以先将字符统一转小写后再处理:

// 需先引入头文件 #include <cctype>
for(i=0;i<a.size();i++)
{
    char lower_ch = tolower(a[i]);
    if (lower_ch >= 'a' && lower_ch <= 'z') {
        j = lower_ch - 'a';
        x[j]++;
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 04:54:04