found = (text.substr(lastfound,text.size())).find(remove);
неверно. Возвращает индекс искомой строки в text.substr(lastfound,text.size())
, но не в text
.
Возможно, вам следует изменить это на found = text.find(text, lastfound);
.
Помимо неправильности, взятие подстроки (это значит, выделение новой строки) и вычисление индекса в ней весьма неэффективно, если оптимизатор не является супер-умным.
Более того, последний returned += text.substr(lastfound,found);
также неверен: вам нужно добавить последний фрагмент текста, а не индекс до found
(который, скорее всего, пуст, так как lastfound
может быть меньше, чем found
. Лучше было бы returned += text.substr(lastfound);
Edit:
Во втором примере вам нужно заменить returned += text.substr(lastfound,found);
на returned += text.substr(lastfound,found-lastfound);
. Второй аргумент substr
- это длина, а не позиция.
С этим изменением тестовый пример отлично работает в моей тестовой программе.
(Дополнение И.Ф. Себастьяна:)
string CensorString1(string const& text, string const& remove){
string returned;
size_t found = string::npos, lastfound = 0;
do {
found = text.find(remove, lastfound);
returned += text.substr(lastfound, found-lastfound);
lastfound = found + remove.size();
} while(found != string::npos);
return returned;
}