多次擦除 std::string 的一部分

Erase a part of a std::string multiple times

本文关键字:string 一部分 std 擦除      更新时间:2023-10-16

我有这个字符串:

"WUBWEWUBAREWUBWUBTHEWUBCHAMPIONSWUBMYWUBFRIENDWUB"

我想删除"WUB" "WE ARE THE CHAMPIONS MY FRIEND".我试过这段代码但它不起作用,尽管它适用于"WUBWUBABCWUB"并提供正确的输出"ABC".

int main()
{
    std::string x,s;
    std::cin >> x;
    for(int i = 0; i < x.size(); i++)
    {
        s = x.erase(x.find("WUB"), 3);
    }
    return 0;
}

当 WUB 的所有出现都被擦除时,就会出现问题:如果字符串中没有 WUB,find 将返回魔术值 string::npos,这通常是一个非常大的数字,访问此索引可能会导致越界异常。

请参阅文档:

第一个匹配项的第一个字符的位置。如果没有匹配项 找到,该函数返回字符串::NPOS。

这是 Ide-One 中的一个工作示例,如果没有下面的新行,它将抛出:

terminate called after throwing an instance of 'std::out_of_range'
  what():  basic_string::erase: __pos (which is 4294967295) > this->size() (which is 25)

添加字符串是否包含搜索字符串的检查可解决此问题:

#include <iostream>
#include <string>
using namespace std;
int main() {
    string x = "WUBWEWUBAREWUBWUBTHEWUBCHAMPIONSWUBMYWUBFRIENDWUB";
    string s;
    for(int i=0; i<x.size(); i++)
    {
        if (x.find("WUB") != string::npos) // <=== this is new
            s = x.erase(x.find("WUB"),3);
    }
    cout<<s;
    return 0;
}

PS:我认为这个问题不值得10票反对。