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

C++字符串越界报错求助:basic_string::at索引超出范围问题排查

问题排查:字符串越界访问导致的异常

嘿,我来帮你搞定这个报错!

首先,这个错误what(): basic_string::at: __n (值为14) >= this->size() (值为14)的核心原因是字符串索引越界了。

为什么会越界?

C++里的字符串是**0索引(0-based)**的:比如一个长度为14的字符串,它的有效索引范围是从0到13(第一个字符在索引0,最后一个在索引13)。而你的代码里写了word[length],当length等于14时,你试图访问索引14的位置——这个位置根本不存在,所以触发了越界异常。

你的longword函数逻辑是想在字符串过长时,输出「首字符 + 长度 + 尾字符」,对吧?那尾字符的正确索引应该是length - 1,或者用更直观的word.back()(C++11及以后版本支持)。

修正后的代码

这里给出两种可行的修正方案:

方案1:手动计算尾字符索引

void longword(string word) {
    int length = word.length();
    if (length > 10) {
        // 把word[length]改成word[length - 1],访问最后一个有效字符
        cout << word[0] << length << word[length - 1];
    } else {
        cout << word;
    }
}
int main() {
    string word;
    int n;
    cin >> n;
    for (int a = 0; a < n; a++) {
        cin >> word;
        longword(word);
        cout << endl;
    }
}

方案2:使用string::back()方法(更推荐)

back()是C++标准库提供的直接获取字符串最后一个字符的方法,不需要手动计算索引,更不容易出错:

void longword(string word) {
    int length = word.length();
    if (length > 10) {
        cout << word[0] << length << word.back();
    } else {
        cout << word;
    }
}
// main函数部分不变

额外提醒

  • []运算符访问越界时属于未定义行为,可能不会立刻报错,但会导致程序崩溃或奇怪的结果;而at()方法会直接抛出你看到的这个异常,这也是你能收到明确错误提示的原因。
  • 以后处理字符串索引的时候,一定要记住:长度为N的字符串,最大有效索引是N-1。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 11:27:36