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

std::string::substr使用异常:if块未触发无法移除字符串中的WUB

问题分析与修复

你的代码里std::string::substr的用法完全错误,这是导致逻辑不生效的核心原因:

  • C++中substr的参数是起始位置和截取长度,不是起始位置和结束位置。你写的substr(i,i+2)会从索引i开始,截取i+2个字符——比如i=0时,取的是前2个字符"WU",根本不是"WUB",所以if条件永远不会触发。
  • 另外要注意截取时的边界问题,当剩余字符不足3个时,没必要再判断是否是"WUB",避免越界。

修复后的代码

#include <iostream>
#include <string>

using namespace std;

int main()
{
    string s = "WUBhello";
    for (int i = 0; i < s.length(); ) { // 移除循环内的i++,手动控制步长
        // 先检查剩余字符足够截取3个,再判断是否匹配"WUB"
        if (i + 3 <= s.length() && s.substr(i, 3) == "WUB") {
            // 直接跳过"WUB"的3个字符
            i += 3;
        } else {
            // 输出当前字符并移动到下一个
            cout << s[i];
            i++;
        }
    }
    return 0;
}

额外说明

  1. 把循环里的i++移到else分支,这样找到"WUB"时可以直接跳过3个字符,避免重复自增导致的步长错误。
  2. 替换了#include <bits/stdc++.h>为具体的<iostream>和<string>头文件,虽然前者能编译,但实际项目中推荐包含必要头文件,减少编译开销和潜在冲突。
  3. 增加i + 3 <= s.length()的判断,防止字符串末尾字符不足3个时调用substr产生未定义行为。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 16:07:50