Отправляет email-рассылки с помощью сервиса Sendsay

[prg] C++. Функция замены в строке одной подстроки на другую

Здравствуйте, уважаемые!

Вторую неделю мучаюсь, но никак не могу найти приемлимого решения. В интернете
нахожу громоздкие простыни кода, которые еще не факт что заработают. Перелопатил
уйму материалов, пытаясь применить метод replace, но тоже пока никаких результатов.
Солнышком в окошке проблеснула библиотека boost, в которой замена реализована
тремя четырьмя строками, но к сожалению, подключить последнюю я так и не смог.

Пожалуйста, помогите! Что делать, куда и где копать?

p.s. Да, C++ - это не PHP :-(

Грызунов Александр. Самара.

Ответить   Thu, 7 Jun 2012 00:30:48 +0300 (#2475651)

 

Ответы:

здравствуйте александр. функции поиска и замены находятся в библиотеке
afxdlgs.h. приведу первую строку,с помощью которой вы сможете найти и
посмотреть нужный класс:
class CFindReplaceDialog : public CCommonDialog

сначала с помощью функции CReate создайте в вашей программе немодальное
диалоговое окно. для того,чтобы что-то заменить- его сначала надо найти.
поэтому сперва нужно организовать поиск,а затем вызвать функцию замены.
чтобы всё правильно работало надо написать немало программного кода.

Ответить   Thu, 7 Jun 2012 21:45:58 +0300 (#2476926)

 

Приветствую всех.

Если ты собираешься выполнять однократную замену, то replace подойдет, а если
ты хочешь заменить все вхождения подстроки в строке, то это слишком накладно,
т.к. на каждой итерации строка будет собираться снова с остатком, в котором замены
еще не выполнены. А тебе нет необходимости собирать строку, пока все вхождения
подстроки не обработаны.

Можно попробовать такой вариант: использовать две позиции (first и last.
0. Изначально first=0.
1. При помощи find перемещаем last на первое вхождение подстроки, начиная от
first.
2. Добавляем (метод append) фрагмент от first до last в строку-приемник.
3. Если last не вышла за пределы строки-источника, то в строку-приемник добавляем
подстроку-заменитель.
4. Пропускаем в строке-источнике подстроку, смещая first на длину подстроки.
5. Идем к пункту 1.
Понятно, что это все делается в цикле с проверкой выхода позиций first и last
за границу строки и проверкой исходных аргументов на корректность.
Для целей производительности можно в строке-приемнике сразу зарезервировать (метод
reserve) некоторый объем памяти (например, равный строке-источнику), чтобы уменьшить
количество операций выделения/освобождения/копирования памяти в процессе добавления
фрагментов в строку-приемник.
Если сам не осилишь, то покажу код.

Успехов. Анатолий.

Ответить   "i_chay" Fri, 8 Jun 2012 21:24:58 +0400 (#2478106)