Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Как заменить в строке S все вхождения.....


Автор: Frikazoid 8.1.2003, 22:43
Привет Всем!
У меня возникла одна проблема.
Мне нужно заменить в строке S все вхождения строки S1 на строку S2
К примеру так replace('abcddddabcdmmmmabcd','abcd','dcba');
А вот и мой код:

function replace(s,p1,p2:string):string;
var i,l1,l2:integer;
begin
l1:=length(p1);
l2:=length(s);
repeat
i:=ansipos(p1,s);
if i=0 then break;
s:=copy(s,1,i-1)+p2+copy(s,i+l1,l2);
until i=0;
replace:=s;
end;

Она хорошо работает, но есть одно НО, она шикарно тормозит, особенно
если строка больше 30Kb, а если строка больше 400КВ, то комп ваще
виснит.


Помогите плз оптимизировать.

Заранее спасибо.

Автор: Baa 8.1.2003, 23:36
Уж не знаю, на скоко это оптимизирует... но ИМХО, сморится лучше...
function replace(s, p1,p2:String):string;
var
 i, l1, l2:integer;
Begin
 l1:=length(p1);
 l2:=length(s);
 for i := 1 to (l2-l1)+1 do
   begin
     if (CompareMem(@s[i], @p1[1], l1)) then CopyMemory(@s[i], @p2[1], l1);
   end;
 replace:=s;
end;

Автор: Vit 9.1.2003, 02:07
А зачем? Если есть стандартная функция StringReplace?

Автор: Song 9.1.2003, 04:51
:) да..

Автор: Baa 10.1.2003, 21:59
Цитата(Vit @ 08.1.2003, 18:07)
А зачем? Если есть стандартная функция StringReplace?

Всегда интересней изобрести свое колесо...
а) из-за незнания, что колесо уже изобретено...
б) нужно колесо определенной формы (под конкретную задачу, а не универсальное)
в) процесс изобретения колеса приносит наслаждение, а также добавляет опыт по изобретению колес.

Автор: Frikazoid 10.1.2003, 23:01
Baa, ты прав! Мне доставляет большое удовольствие изобретение колёс.
На самом деле я просто не знал, что такая фун-я существует. Точнее Я
искал её, но не нашёл! У меня просто нет справочника по фун-ям :(

Спасибо всем за участие!

Автор: Song 11.1.2003, 20:33
:-)))
Ну-ну, не хотите на колесо посмотреть: http://pascal.sources.ru/cgi-bin/forum/YaBB.cgi?board=delphi;action=display;num=1042014812

Автор: Medved 13.1.2003, 02:56
http://delphi.mastak.ru/cgi-bin/download.pl?look=1&id=1041787265&n=2 - да... фишка сильная...  :D  :D  :D

Автор: Ramstar 13.1.2003, 19:12
да изврат, а можно было проще пребрать на ассемблере и памяти меньше и скорость больше

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)