замена всех вхождений подстроки в строке
моя программа получает од пользователя три строчки.
первая - строка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 шт):
Понятно почему так просиходит.
Вы берете строку abab, меняете в ней первую a на aa - получается строка aabab.
И в этом месте Ваш прелестный алгоритм даёт сбой: вы видите в "следующей позиции" ту букву a, которая явилась результатом замены....
ну, понятно, что Вы уйдёте в бесконечный цикл.
Избавиться от этого довольно просто: нужно сначала наметить в строке те места, в котоорых надо произвести замену, а вторым шагом уже сделать замену.
Тогда у Вас результат замены никак не будет влиять на процесс.
Грубо говоря, исходная строка никогда не "смешивается логически" с результатом.
"мне странно то, что если я хочу заменить a -> aa то не работает, а если b -> aa то все работает" - тот удивительный случай, когда всё само чинится. Так как при замене b на aa у Вас не прооисходит увеличения в строке кол-ва тех символов, для которых происходт замена - то Вашему алгоритму наплевать на то, что строка изменилась.
Вот если бы при замене a -> aa всё ломалось, а при замене b -> bb - работало - вот это был бы номер!
А вы не хотите, раз уж используете 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);
Этого вполне достаточно...