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

时间:2015-02-03 14:52:48

标签: c++

我有这个字符串:

"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;
}

1 个答案:

答案 0 :(得分:2)

当WUB的所有出现都被删除时会出现问题:如果字符串中没有WUB,则find将返回魔术值字符串:: npos,这通常是一个非常大的数字,并且访问此索引可能会导致一个超出范围的例外。

See the documentation

  

第一场比赛的第一个角色的位置。如果没有匹配   找到后,该函数返回string :: npos。

这是一个working example in 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个投票。