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

程序因索引越界终止,请求排查字符串处理代码异常

问题排查与修正方案

嘿,我来帮你搞定这个程序的问题~你的代码里有几个小问题导致了异常和功能不符合预期,咱们一个个说:

1. 字符判断的逻辑错误(导致有效字符无法被筛选)

你写的判断条件 if((ch<=65&&ch<=90)||(ch>=97&&ch<=122)) 明显写错了:大写字母的ASCII范围是65(A)到90(Z),所以第一个判断应该是 ch >= 65 && ch <=90,原来的写法会让程序几乎筛选不到任何大写字母。

2. 循环变量类型不匹配(潜在的索引越界根源)

tem.length() 返回的是 size_t 类型(无符号整数),而你用了 int 类型的 i 做循环变量。当字符串长度超过 int 的最大值时,i 会溢出变成负数,和无符号的 size_t 比较时会被转换成超大的正数,导致循环错误地继续执行,最终触发at()方法的索引越界异常。

3. 遗漏排序功能&输出变量名错误

你的需求是输出排序后的字符串,但原代码里完全没有排序逻辑;另外最后输出的cout<<me...是变量名拼写错误,应该是mes。


修正后的完整代码

#include <iostream>
#include <string>
#include <algorithm>  // 用于sort排序函数
using namespace std;

int main(){
    string mes;
    string tem;
    cin >> tem;

    // 用size_t作为循环变量,避免无符号/有符号类型不匹配问题
    for (size_t i = 0; i < tem.length(); ++i){
        char ch = tem.at(i);
        // 正确判断大小写字母的范围
        if((ch >= 65 && ch <= 90) || (ch >= 97 && ch <= 122)){
            mes += ch;
        }
    }

    // 对筛选后的字母字符串进行排序
    sort(mes.begin(), mes.end());

    // 输出最终结果
    cout << mes << endl;
    return 0;
}

额外优化建议

如果你觉得用ASCII码判断不够直观,可以用C++标准库的isalpha()函数(需要包含<cctype>头文件),把判断条件改成if(isalpha(ch))即可,代码可读性会更高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:02:54