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

C++中如何遍历std::string最后一个元素且不出现越界错误

问题根因

  • while 循环的判断逻辑顺序错误:代码先执行input.at(i) == input.at(i+1)的元素访问操作,再校验i < input.size()-1的边界条件。当i等于字符串最后一个元素的下标(即input.size()-1)时,i+1已经超出合法下标范围,at()方法会直接抛出std::out_of_range异常,导致程序提前终止,因此最后一个字符c未被处理,输出缺少1c。
  • 边界校验存在隐性风险:input.size()返回无符号类型size_t,如果输入为空字符串,input.size()-1会发生无符号数下溢,变成极大值,会触发更严重的越界访问问题。

修复方案

调整 while 循环的条件顺序,利用 C++ 逻辑与&&的短路求值特性:先校验边界合法性,再执行元素访问,边界不合法时不会执行后面的越界访问操作,不需要修改 for 循环的终止条件,就能正常处理到最后一个元素。

修复后可正常运行的代码如下:

#include <string>
#include <vector>

int main() {
    std::string input = "abc";
    std::vector<int> number;
    std::vector<char> character;

    // 空输入提前返回,避免无符号数下溢问题
    if (input.empty()) {
        return 0;
    }

    // 循环变量使用与size()返回值匹配的无符号类型,避免隐式转换问题
    for (std::string::size_type i = 0; i < input.size(); i++) {
        int counter = 1;
        // 先判断边界,再访问i+1位置的元素,短路逻辑避免越界
        while (i < input.size() - 1 && input.at(i) == input.at(i + 1)) {
            counter++;
            i++;
        }
        number.push_back(counter);
        character.push_back(input.at(i));
    }

    // 输出验证:遍历number和character拼接结果即可得到1a1b1c
    return 0;
}

效果验证

输入为abc时,i遍历到最后一个下标2时,i < input.size()-1的条件结果为假,while 循环不执行,直接将counter=1和字符c存入对应容器,最终输出结果符合1a1b1c的预期,且不会出现越界错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 23:27:02