замена всех вхождений подстроки в строке

моя программа получает од пользователя три строчки.
первая - строка01, в которой нужно найти все вхождения строки02 и заменить их на строку03
вторая - строка02
третья - строка03
пример:

str_01 = abab
str_02 = a
str_03 = EEE
result = EEEbEEEb

то есть, в строке abab нужно все a заменить на EEE .
при таких данных все работает отлично, но когда я пишу следующие данные:

str_01 = abab
str_02 = a
str_03 = aa
result = бесконечный цикл

почему так происходит?

std::string str_01, str_02, str_03, sub_str;
int counter_sub = 0, position;
short no_sub = 0;
std::cout << "enter str: ";
getline(std::cin, str_01);
std::cout << "sub str: ";
getline(std::cin, str_02);
std::cout << "change str: ";
getline(std::cin, str_03);
for (int i = 0; i < str_01.length(); i++) {
    if (str_01[i] == str_02[counter_sub]) {
        sub_str.insert(counter_sub, 1, str_01[i]);
        counter_sub++;
        if (sub_str.length() == str_02.length()) {
            position = i - sub_str.length() + 1;
            str_01.erase(position, sub_str.length());
            str_01.insert(position, str_03);
            no_sub = 1;
            i -= sub_str.length();
        }
    } else {
        sub_str = "";
        counter_sub = 0;
    }
}
if (no_sub == 0) {
    std::cout << "no search sub str\n";
} else {
    std::cout << "result = " << str_01 << "\n";
}

Ответы (2 шт):

Автор решения: S.H.

Понятно почему так просиходит.

Вы берете строку abab, меняете в ней первую a на aa - получается строка aabab.

И в этом месте Ваш прелестный алгоритм даёт сбой: вы видите в "следующей позиции" ту букву a, которая явилась результатом замены....

ну, понятно, что Вы уйдёте в бесконечный цикл.

Избавиться от этого довольно просто: нужно сначала наметить в строке те места, в котоорых надо произвести замену, а вторым шагом уже сделать замену.

Тогда у Вас результат замены никак не будет влиять на процесс.

Грубо говоря, исходная строка никогда не "смешивается логически" с результатом.

"мне странно то, что если я хочу заменить a -> aa то не работает, а если b -> aa то все работает" - тот удивительный случай, когда всё само чинится. Так как при замене b на aa у Вас не прооисходит увеличения в строке кол-ва тех символов, для которых происходт замена - то Вашему алгоритму наплевать на то, что строка изменилась.

Вот если бы при замене a -> aa всё ломалось, а при замене b -> bb - работало - вот это был бы номер!

→ Ссылка
Автор решения: Harry

А вы не хотите, раз уж используете string, воспользоваться его возможностями?

for(size_t pos = 0;(pos = str_01.find(str_02,pos)) != str_01.npos;pos += str_03.length())
    str_01 = str_01.replace(pos,str_02.length(),str_03);

Этого вполне достаточно...

→ Ссылка