为何统计字符串字母出现次数的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
相关产品推荐
相关产品推荐

