Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.97.9.173] |
|
Сообщ.
#1
,
|
|||||
|
Заранее прошу прощения, просто неудержался и запостил своё творение (разумееться я не такой наивный чтобы думать, что я первый придумал этот алгоритм) авось кому пригодиться. Написать сие, меня побудил вот этот фрагмент кода на дельфи
Думаю коментарии излишни.
PS А есть способ оптималнее вышеописанного? PSS Варианты типа - на асме будет быстрее НЕ предлагать, меня сейчас волнует алгоритмическая оптимизация. |
Сообщ.
#2
,
|
|
|
Жуть... ну и наворотил ))
Глянь на мою поделку: {-----------------------------------------------} {Replace all "Search" substrings to "Repl" substrings in the "S" string} Function ReplaceAll(S:string;const Search,Repl:string):String; var p:byte; begin Repeat p:=Pos(Search,S); If p>0 then begin Delete(S,p,Length(Search)); Insert(Repl,S,p); end; until (p=0); ReplaceAll:=S; end; |
Сообщ.
#3
,
|
|
|
Цитата То вы жалуетесь что комментариев мало то Жуть... ну и наворотил )) наоборот слишком много, да вам неугодишь А вообще в таких случаях лучше всего поступать по методу Сонга - положить эти функции в какой нить модуль и забыть про них ;D Цитата Ой, буду критиковать Глянь на мою поделку: Даже если закрыть глаза на врождённую короткость string'ового типа и многочисленные лишние перемещения символов туда-сюда (вместо одного направленного их перемещения сразу в конечное положение как у меня ) Я немогу пропустить мимо глас явный баг: Попробуйте с помощью своей процедуры заменить в строке ' ляляля_ЛЕС_ляля тополя' подстроку 'ЛЕС' на строку 'ЛЕСОПОВАЛ' Вот готовая прога пытающася это проделать uses crt; {Replace all "Search" substrings to "Repl" substrings in the "S" string} Function ReplaceAll(S:string;const Search,Repl:string):String; var p:byte; begin Repeat p:=Pos(Search,S); If p>0 then begin Delete(S,p,Length(Search)); Insert(Repl,S,p); end; until (p=0); ReplaceAll:=S; end; var s:string; begin clrscr; s:='лялляля_ЛЕС_лялялятополя'; writeln('Перед заменой: ',s); write('Для выхода рекоммендую Сtrl+Break') write('После замены: ',ReplaceAll(s,'ЛЕС','ЛЕСОПОВАЛ')); readln; end. ЗЫ Простите если был слишком резок. |
Сообщ.
#4
,
|
|
|
Хорошая критика всегда полезна!
Предлагайте решение |
Сообщ.
#5
,
|
|
|
Цитата Хорошая критика всегда полезна! Предлагайте решение Дык, я же уже предложил : |
Сообщ.
#6
,
|
|
|
Имхо нужно последовательно искать строку, но при нахождении заменить и прыгнуть за конец замененного текста, чтобы избежать повторов замены. Типа вот такого:
function isthere(var wher:string;p:integer;var whattoseek:string):boolean; var i:integer; b:boolean; begin b:=true; i:=0; while b and i<min(length(wher)-p,length(whattoseek)) do begin b:=wher[p+i]=whattoseek[i+1]; inc(i); end; isthere:=b; end; procedure replaceall(var wher:string;whattoseek:string;towhat:string); var p:integer; begin p:=1; while p<length(wher)-length(whattoseek)+1 do begin if iswhere(wher,p,whattoseek) then begin delete(wher,p,length(whattoseek)); insert(towhat,wher,p); p:=p+length(towhat); end else inc(p); end; end; Проверяй, мне нельзя на работе. |
Сообщ.
#7
,
|
|
|
Может так?
function ReplaceAll( S : string; const Search, Replace : string ) : string; var P : byte; begin P := Pos( Search, S ); if P <> 0 then begin Delete( S, P, Length( Search ) ); Insert( Replace, S, P ); ReplaceAll := Copy( S, 1, P + Length( Search ) - 1 ) + ReplaceAll( Copy( S, P + Length( Search ), Length( S ) - ( P + Length( Search ) ) + 1 ); end else ReplaceAll := S; end; |
Сообщ.
#8
,
|
|
|
Имхо слишком много вызовов Сору... хотя вроде должна работать.
|
Сообщ.
#9
,
|
|||
|
Показали эту тему в FAQ. Решил посмотреть %) Ну раз уж пошла такая пьянка, вот мой вариант. Работает по тому же принципу, что и ввод вывод в файлы.
|