Как правильно использовать string :: erase - PullRequest
0 голосов
/ 06 мая 2019

Я не уверен, правильно ли я использую string :: erase.Я пытаюсь создать функцию, которая найдет подстроку и сотрет ее из исходной строки.Я уже проверял эту строку: найти работает, но когда дело доходит до стирания, та же самая строка все еще там.

Исходный файл .cpp

Sentence operator-(const Sentence& arg1, const Sentence& arg2)
{
    Sentence result = arg1;

    string str = arg1.get_sentence();
    string str2 = arg2.get_sentence();

    bool found = false;


    if (str2.find(str) != std::string::npos) {

        found = true;

    } else if (found == true) {

        str2.erase(str.find(str), str2.size());

    }


    return str2;

}

Ответы [ 3 ]

1 голос
/ 06 мая 2019

В вашем коде есть две ошибки.

Сначала вы испортили логику оператора if, чтобы оператор erase никогда не выполнялся (как указано в другом ответе).

Второй Вы использовали 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());
0 голосов
/ 06 мая 2019

, если вы хотите удалить все те же подстроки из исходной строки. Это может сработать.

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

Надеюсь, это поможет.

0 голосов
/ 06 мая 2019

Если переписать

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());
}
...