我有这个字符串:
"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;
}
答案 0 :(得分:2)
当WUB的所有出现都被删除时会出现问题:如果字符串中没有WUB,则find将返回魔术值字符串:: npos,这通常是一个非常大的数字,并且访问此索引可能会导致一个超出范围的例外。
第一场比赛的第一个角色的位置。如果没有匹配 找到后,该函数返回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个投票。