我不确定我是否正确使用string :: erase。我试图做一个可以找到子字符串并将其从原始字符串中删除的函数。我已经测试过string:find可以工作,但是在擦除时,仍然存在相同的字符串。
源文件.cpp
eth_newFilter
答案 0 :(得分:1)
您的代码中有两个错误。
首先,您搞砸了if
语句逻辑,以便从不执行擦除语句(如另一个答案所指出)。
第二,您错误地使用了std::string::erase()
。第一个参数应该是要删除的第一个字符的索引,第二个参数应是要删除的字符总数的索引。
由于您已经搜索了子字符串,因此可以循环使用该信息以与erase
一起使用。因此,我们的代码的正确版本是
auto pos = str.find(sub);
if(pos != std::string::npos)
str.erase(pos,sub.size());
如果要删除所有出现在子字符串中的 ,可以使用for
循环:
for(auto pos=str.find(sub); pos!=std::string::npos; pos=str.find(sub))
str.erase(pos,sub.size());
答案 1 :(得分:0)
如果我们重写
if (str2.find(str) != std::string::npos) {
found = true;
} else if (found == true) {
str2.erase(str.find(str), str2.size());
}
类似于编译器如何解析它,就像
if (str2.find(str) != std::string::npos) {
found = true;
} else {
if (found == true) {
str2.erase(str.find(str), str2.size());
}
}
现在很容易看到else
分支中的条件永远不会成立。如果发生else
分支,则不可能发生另一个分支,并且found
仍将是false
。
使用显示的代码,您只需跳过found
变量,然后执行
if (str2.find(str) != std::string::npos) {
str2.erase(str.find(str), str2.size());
}
答案 2 :(得分:0)
如果您要从原始字符串中删除所有相同的子字符串,则可能会起作用。
while(str2.find(str) != std::string::npos) {
str2.erase(str2.find(str), str2.size());//here
}
return str2;//you shouldn't return string, it's not your return type.
str.erase (pos,length); //your choice
//if str="abcdefg"
str.erase(3,2);
//str="abcfg"
或
str.erase (first,last);
//if str="abcdefg"
str.erase(str.begin()+3,str.begin()+5);
//str="abcfg"
如果str2是str的子字符串,则为“ str.find(str2);”。将返回它第一次出现的第一个位置。
str="Thank you";
str2="you";
str.find(str2);//return 6
如此
str2.erase(str.find(str), str2.size());
应该是
str2.erase(str2.find(str), str2.size());
希望会有所帮助。