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
相关产品推荐
相关产品推荐

