如何正确使用string :: erase

时间:2019-05-05 22:42:53

标签: c++ substring erase

我不确定我是否正确使用string :: erase。我试图做一个可以找到子字符串并将其从原始字符串中删除的函数。我已经测试过string:find可以工作,但是在擦除时,仍然存在相同的字符串。

源文件.cpp

eth_newFilter

3 个答案:

答案 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());

希望会有所帮助。