<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=14403&amp;view=findpost&amp;p=271319</guid>
        <pubDate>Fri, 26 Dec 2003 23:10:42 +0000</pubDate>
        <title>Эффективный Replace ALL</title>
        <link>https://forum.sources.ru/index.php?showtopic=14403&amp;view=findpost&amp;p=271319</link>
        <description><![CDATA[Some1: Показали эту тему в FAQ. Решил посмотреть %)<br>Ну раз уж пошла такая пьянка, вот мой вариант. Работает по тому же принципу, что и ввод вывод в файлы.<!--c1--></div><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td><b></b> </td></tr><tr><td id='CODE'><!--ec1-->const<br>&nbsp; s&#58;string=&#39;123ababcc456abcabc78ababc&#39;;<br>&nbsp; fs&#58;string=&#39;a&#39;;<br>&nbsp; ns&#58;string=&#39;defgh&#39;;<br><br>function strreplace&#40;var s&#58;string;fs,ns&#58;string&#41;&#58;integer;<br>var<br>&nbsp; ts&#58;string;<br>&nbsp; p,k,n&#58;byte;<br>begin<br>&nbsp; strreplace&#58;=-1;<br>&nbsp; if s+fs+ns=&#39;&#39; then exit;<br>&nbsp; k&#58;=1;<br>&nbsp; p&#58;=1;<br>&nbsp; ts&#58;=&#39;&#39;;<br>&nbsp; n&#58;=0;<br>&nbsp; while p&#60;=byte&#40;s&#91;0&#93;&#41;do<br>&nbsp; begin<br>&nbsp; &nbsp; if s&#91;p&#93;=fs&#91;k&#93; then<br>&nbsp; &nbsp; begin<br>&nbsp; &nbsp; &nbsp; if k&#60;byte&#40;fs&#91;0&#93;&#41; then inc&#40;k&#41; else<br>&nbsp; &nbsp; &nbsp; begin<br>&nbsp; &nbsp; &nbsp; &nbsp; ts&#58;=ts+ns;<br>&nbsp; &nbsp; &nbsp; &nbsp; inc&#40;n&#41;;<br>&nbsp; &nbsp; &nbsp; &nbsp; k&#58;=1;<br>&nbsp; &nbsp; &nbsp; end;<br>&nbsp; &nbsp; end else<br>&nbsp; &nbsp; begin<br>&nbsp; &nbsp; &nbsp; dec&#40;p,k-1&#41;;<br>&nbsp; &nbsp; &nbsp; ts&#58;=ts+s&#91;p&#93;;<br>&nbsp; &nbsp; &nbsp; k&#58;=1;<br>&nbsp; &nbsp; end;<br>&nbsp; &nbsp; inc&#40;p&#41;;<br>&nbsp; end;<br>&nbsp; s&#58;=ts;<br>&nbsp; strreplace&#58;=n;<br>end;<br>begin<br>&nbsp; strreplace&#40;s,fs,ns&#41;;<br>&nbsp; writeln&#40;&#39;&#58;&#39;,s,&#39;&#58;&#39;&#41;;<br>end.<!--c2--></td></tr></table><div class='postcolor'><!--ec2-->]]></description>
        <author>Some1</author>
        <category>Pascal</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=14403&amp;view=findpost&amp;p=122214</guid>
        <pubDate>Fri, 15 Aug 2003 11:39:19 +0000</pubDate>
        <title>Эффективный Replace ALL</title>
        <link>https://forum.sources.ru/index.php?showtopic=14403&amp;view=findpost&amp;p=122214</link>
        <description><![CDATA[vesper1: Имхо слишком много вызовов Сору... хотя вроде должна работать.]]></description>
        <author>vesper1</author>
        <category>Pascal</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=14403&amp;view=findpost&amp;p=122213</guid>
        <pubDate>Fri, 15 Aug 2003 08:18:49 +0000</pubDate>
        <title>Эффективный Replace ALL</title>
        <link>https://forum.sources.ru/index.php?showtopic=14403&amp;view=findpost&amp;p=122213</link>
        <description><![CDATA[Favst: Может так?<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">function ReplaceAll( S : string; const Search, Replace : string ) : string;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;P : byte;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;P := Pos( Search, S );</div><div class="code_line">&nbsp;&nbsp;if P &#60;&#62; 0 then</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;Delete( S, P, Length( Search ) );</div><div class="code_line">&nbsp;&nbsp; &nbsp;Insert( Replace, S, P );</div><div class="code_line">&nbsp;&nbsp; &nbsp;ReplaceAll := Copy( S, 1, P + Length( Search ) - 1 ) + ReplaceAll( Copy( S, P + Length( Search ), Length( S ) - ( P + Length( Search ) ) + 1 );</div><div class="code_line">&nbsp;&nbsp;end</div><div class="code_line">&nbsp;&nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp;ReplaceAll := S;</div><div class="code_line">end;</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script>]]></description>
        <author>Favst</author>
        <category>Pascal</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=14403&amp;view=findpost&amp;p=122212</guid>
        <pubDate>Fri, 15 Aug 2003 06:04:30 +0000</pubDate>
        <title>Эффективный Replace ALL</title>
        <link>https://forum.sources.ru/index.php?showtopic=14403&amp;view=findpost&amp;p=122212</link>
        <description><![CDATA[vesper1: Имхо нужно последовательно искать строку, но при нахождении заменить и прыгнуть за конец замененного текста, чтобы избежать повторов замены. Типа вот такого:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">function isthere(var wher:string;p:integer;var whattoseek:string):boolean;</div><div class="code_line">var i:integer;</div><div class="code_line">&nbsp;&nbsp; &nbsp;b:boolean;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;b:=true;</div><div class="code_line">&nbsp;&nbsp;i:=0;</div><div class="code_line">&nbsp;&nbsp;while b and i&#60;min(length(wher)-p,length(whattoseek)) do begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;b:=wher[p+i]=whattoseek[i+1];</div><div class="code_line">&nbsp;&nbsp; &nbsp;inc(i);</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;&nbsp;isthere:=b;</div><div class="code_line">end;</div><div class="code_line">procedure replaceall(var wher:string;whattoseek:string;towhat:string);</div><div class="code_line">var p:integer;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;p:=1;</div><div class="code_line">&nbsp;&nbsp;while p&#60;length(wher)-length(whattoseek)+1 do begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;if iswhere(wher,p,whattoseek) then begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;delete(wher,p,length(whattoseek));</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;insert(towhat,wher,p);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;p:=p+length(towhat);</div><div class="code_line">&nbsp;&nbsp; &nbsp;end else inc(p);</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">end;</div></ol></div></div></div></div><br>
Проверяй, мне нельзя на работе.]]></description>
        <author>vesper1</author>
        <category>Pascal</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=14403&amp;view=findpost&amp;p=122211</guid>
        <pubDate>Fri, 15 Aug 2003 01:42:28 +0000</pubDate>
        <title>Эффективный Replace ALL</title>
        <link>https://forum.sources.ru/index.php?showtopic=14403&amp;view=findpost&amp;p=122211</link>
        <description><![CDATA[Mixxx: <div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>Хорошая критика всегда полезна! <br>Предлагайте решение :) </div></div><br>Дык, я же уже предложил &nbsp;::)]]></description>
        <author>Mixxx</author>
        <category>Pascal</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=14403&amp;view=findpost&amp;p=122210</guid>
        <pubDate>Thu, 14 Aug 2003 17:20:02 +0000</pubDate>
        <title>Эффективный Replace ALL</title>
        <link>https://forum.sources.ru/index.php?showtopic=14403&amp;view=findpost&amp;p=122210</link>
        <description><![CDATA[vot: Хорошая критика всегда полезна!<br>Предлагайте решение :)]]></description>
        <author>vot</author>
        <category>Pascal</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=14403&amp;view=findpost&amp;p=122209</guid>
        <pubDate>Thu, 14 Aug 2003 17:05:57 +0000</pubDate>
        <title>Эффективный Replace ALL</title>
        <link>https://forum.sources.ru/index.php?showtopic=14403&amp;view=findpost&amp;p=122209</link>
        <description><![CDATA[Mixxx: <div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>Жуть... ну и наворотил :)))</div></div>То вы жалуетесь что комментариев мало то <br>
наоборот слишком много, да вам неугодишь :)<br>
А вообще в таких случаях лучше всего поступать по методу<br>
Сонга - положить эти функции в какой нить модуль и забыть про них ;D<br>
<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>Глянь на мою поделку: </div></div>Ой, буду критиковать :)<br>
Даже если закрыть глаза на врождённую короткость string&#39;ового типа<br>
и многочисленные лишние перемещения символов туда-сюда<br>
(вместо одного направленного их перемещения сразу в конечное <br>
положение как у меня :) ) Я немогу пропустить мимо  глас  явный баг:<br>
Попробуйте с помощью своей процедуры заменить <br>
в строке &#39; ляляля_ЛЕС_ляля тополя&#39;<br>
подстроку &#39;ЛЕС&#39; на строку &#39;ЛЕСОПОВАЛ&#39;<br>
<br>
Вот готовая прога пытающася это проделать<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">uses crt;</div><div class="code_line">{Replace all &quot;Search&quot; substrings to &quot;Repl&quot; substrings in the &quot;S&quot; string}</div><div class="code_line">Function ReplaceAll(S:string;const Search,Repl:string):String;</div><div class="code_line">var p:byte;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp; Repeat</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;p:=Pos(Search,S);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;If p&#62;0 then begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; Delete(S,p,Length(Search));</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; Insert(Repl,S,p);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; until (p=0);</div><div class="code_line">&nbsp;&nbsp; ReplaceAll:=S;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">var s:string;</div><div class="code_line">begin clrscr;</div><div class="code_line">&nbsp;s:=&#39;лялляля_ЛЕС_лялялятополя&#39;;</div><div class="code_line">&nbsp;writeln(&#39;Перед заменой: &#39;,s);</div><div class="code_line">write(&#39;Для выхода рекоммендую Сtrl+Break&#39;)</div><div class="code_line">&nbsp;write(&#39;После &nbsp;замены: &#39;,ReplaceAll(s,&#39;ЛЕС&#39;,&#39;ЛЕСОПОВАЛ&#39;));</div><div class="code_line">&nbsp;readln;</div><div class="code_line">end.</div></ol></div></div></div></div><br>
ЗЫ Простите если был слишком резок.]]></description>
        <author>Mixxx</author>
        <category>Pascal</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=14403&amp;view=findpost&amp;p=122208</guid>
        <pubDate>Thu, 14 Aug 2003 13:50:35 +0000</pubDate>
        <title>Эффективный Replace ALL</title>
        <link>https://forum.sources.ru/index.php?showtopic=14403&amp;view=findpost&amp;p=122208</link>
        <description><![CDATA[vot: Жуть... ну и наворотил :)))<br>
Глянь на мою поделку:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">{-----------------------------------------------}</div><div class="code_line">{Replace all &quot;Search&quot; substrings to &quot;Repl&quot; substrings in the &quot;S&quot; string}</div><div class="code_line">Function ReplaceAll(S:string;const Search,Repl:string):String;</div><div class="code_line">var p:byte;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp; Repeat</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;p:=Pos(Search,S);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;If p&#62;0 then begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; Delete(S,p,Length(Search));</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; Insert(Repl,S,p);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; until (p=0);</div><div class="code_line">&nbsp;&nbsp; ReplaceAll:=S;</div><div class="code_line">end;</div></ol></div></div></div></div>]]></description>
        <author>vot</author>
        <category>Pascal</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=14403&amp;view=findpost&amp;p=122207</guid>
        <pubDate>Thu, 14 Aug 2003 13:11:39 +0000</pubDate>
        <title>Эффективный Replace ALL</title>
        <link>https://forum.sources.ru/index.php?showtopic=14403&amp;view=findpost&amp;p=122207</link>
        <description><![CDATA[Mixxx:  Заранее прошу прощения, просто неудержался и запостил своё творение (разумееться я не такой наивный чтобы думать, что я первый придумал этот алгоритм) авось кому пригодиться.<br><br>Написать сие, меня побудил вот этот фрагмент кода на дельфи<br><!--c1--></div><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td><b></b> </td></tr><tr><td id='CODE'><!--ec1-->function StringReplaceAll &#40;text,byt,mot &#58; string &#41; &#58;string;<br>{Funktion for att byta ut alla forekomster av en strang mot en<br>annan strang in en strang. Den konverterade strangen returneras.<br>Om byt finns i mot maste vi ga via en temporar variant&#33;&#33;&#33;}<br>var<br>&nbsp;plats &#58; integer;<br>begin<br>&nbsp;While pos&#40;byt,text&#41; &#62; 0 do<br>&nbsp;begin<br>&nbsp; plats &#58;= pos&#40;byt,text&#41;;<br>&nbsp; delete &#40;text,plats,length&#40;byt&#41;&#41;;<br>&nbsp; insert &#40;mot,text,plats&#41;;<br>&nbsp;end;<br>&nbsp;result &#58;= text;<br>end;<!--c2--></td></tr></table><div class='postcolor'><!--ec2-->Думаю коментарии излишни.<br><br><!--c1--></div><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td><b></b> </td></tr><tr><td id='CODE'><!--ec1-->{<br>Представленная ниже функция<br>lreplace&#40;kogo,chem,gde&#58;Pchar&#41;&#58;integer;<br>Находит в строке gde все подстроки kogo и заменяет их на строку chem.<br>А возвращает количество сделанных замен или -1 если ошибка.<br><br>Примечательно что ниже описанный алгоритм НЕ трубует дополнительного <br>буфера для cтроки gde.<br><br>Вся работа проходит в три этапа<br>1.находим все вхождения строки kogo в строку gde и записываем их в массив z а количество вхождений в переменную kol<br>2.аккуратно переписываем  участки строки gde, которые размещены, между найдеными подстроками, на их новое место&#40;всё в тойже строке gde&#41;.<br>3.пишем строку-замену kol раз, в тех местах &#40;строки gde&#41; где это необходимо.<br><br>==================== Этап 1 ==========================<br>Эфективные алгоритмы поиска подстроки в строке ещё более сложны чем этот.<br>Поэтому чтобы непариться просто воспользуемся стандартной функцией из модуля<br>Strings - strpos, слегка её модифицировав &#40;чтобы она начинала искать<br>подстроку с заданой позиции&#41; в функцию <br>lstrposi&#40;kogo,gde&#58;pchar;start&#58;integer&#41;&#58;integer;&#40;lstr в стиле WinAPI &#58;&#41;&#41;<br>kogo &nbsp;     подстрока которую будем искать<br>gde        строка в которой будет производится поиск<br>start      index  начиная с которого будем искать<br>возращает -1 если ничего ненашли или найденую позицию подстроки в случае успеха<br><br>==================== Этап 2 ==========================<br>Далее условимся что<br>Lenkogo&#58;=strlen&#40;kogo&#41;;<br>Lenchem&#58;=strlen&#40;chem&#41;;<br>Len&#58;=strlen&#40;gde&#41;;<br>kol&#58;=количество найденных вхождений &#40;образцов&#41;<br><br>Участки что между образцами &#40;образцы - найденные вхождения, которые мы будем заменять&#41; распологаются так<br><br>&nbsp;           0            z&#91;1&#93;-1<br>z&#91;1&#93;+Lenkogo            z&#91;2&#93;-1<br>z&#91;2&#93;+Lenkogo            z&#91;3&#93;-1<br>...........................<br>z&#91;i&#93;+Lenkogo            z&#91;i+1&#93;-1<br>...........................<br>z&#91;kol&#93;+Lenkogo            len<br><br>&#40;<br>А сами образцы  расположены так &#40;хотя эта инфа нам не пригодится&#41;<br>z&#91;1&#93;                  z&#91;1&#93;+Lenkogo-1<br>z&#91;2&#93;                  z&#91;2&#93;+Lenkogo-1<br>...............................<br>z&#91;i&#93;                  z&#91;i&#93;+Lenkogo-1            <br>...............................<br>z&#91;kol&#93;            z&#91;kol&#93;+Lenkogo-1            <br>&#41;<br><br>Если z&#91;0&#93;&#58;=-Lenkogo и z&#91;kol+1&#93;&#58;=len+1 то тоже самое запишем так&#58;<br><br>z&#91;0&#93;+Lenkogo            z&#91;1&#93;-1<br>z&#91;1&#93;+Lenkogo            z&#91;2&#93;-1<br>z&#91;2&#93;+Lenkogo            z&#91;3&#93;-1<br>..............................<br>z&#91;i&#93;+Lenkogo            z&#91;i+1&#93;-1<br>..............................<br>z&#91;kol&#93;+Lenkogo            z&#91;kol+1&#93;-1<br><br>Наша цель переписать эти участки так&#58;<br>&#40;после того как мы это осуществим, 90% всей работы будет сделано&#41;<br>z&#91;0&#93;+Lenkogo+raz*0            z&#91;1&#93;-1+raz*0<br>z&#91;1&#93;+Lenkogo+raz*1            z&#91;2&#93;-1+raz*1<br>z&#91;2&#93;+Lenkogo+raz*2            z&#91;3&#93;-1+raz*2<br>..........................................<br>z&#91;i&#93;+Lenkogo+raz*i            z&#91;i+1&#93;-1+raz*i<br>..........................................<br>z&#91;kol&#93;+Lenkogo+raz*kol  z&#91;kol+1&#93;-1+raz*kol<br><br>т.е. отодвинуть i-тый участок на растояние = raz*i<br>raz=Lenchem-Lenkogo; т.е. разность му длиннами заменяемой подстроки и строкой для замены<br>Основная трабла в том чтобы во время отодвигания текущего символа<br>незатронуть будущий &#40;который нам только предстоит отодвинуть&#41;<br>Чтобы этого избежать поступим следующим образом&#58;<br>если Lenchem&#60;Lenkogo<br>&nbsp;то            начнём отодвигать стартуя от нулевого символа<br>&nbsp;иначе      начнём отодвигать стартуя от последнего символа<br><br>==================== Этап 3 ==========================<br>Тут уже нам ненадо бояться что мы чего-нибудь запортачим,<br>ведь переписывать мы будем из строки chem в gde,<br>а не из gde в gde &#40;как это было на этапе 2&#41;.<br>Остаёться токо вычислить координаты в которые следует<br>записать строчку chem, вот они&#58;<br>z&#91;1&#93;+raz*0                  z&#91;1&#93;+raz*0+Lenchem-1<br>z&#91;2&#93;+raz*1                  z&#91;2&#93;+raz*1+Lenchem-1<br>z&#91;3&#93;+raz*2                  z&#91;3&#93;+raz*2+Lenchem-1<br>....................................................<br>z&#91;i&#93;+raz*&#40;i-1&#41;                  z&#91;i&#93;+raz*&#40;i-1&#41;+Lenchem-1<br>....................................................<br>z&#91;kol&#93;+raz*&#40;kol-1&#41;            z&#91;kol&#93;+raz*&#40;kol-1&#41;+Lenchem-1<br><br><br>======================================================<br>Все пунктационные и орфографические ошибки являются интеллектуальным достоянием автора, при перепечатке их исправление запрещено &#58;&#41;&#41;&#41;<br>© Mixxx 2002-2003<br>}<br><br>program replace;<br>{&#036;X+}<br>uses Strings,crt;<br>type pstr=Pchar;<br>var<br>&nbsp;s,sub,zam&#58;string&#91;255&#93;;<br><br>function lstrposi&#40;kogo,gde&#58;pchar;start&#58;integer&#41;&#58;integer;<br>var b&#58;pstr;<br>&nbsp;   p&#58;pstr;<br>begin<br>if start&#62;strlen&#40;gde&#41;<br>&nbsp;then lstrposi&#58;=-1<br>&nbsp;else<br>&nbsp; begin<br>&nbsp;  p&#58;=@&#40;gde&#91;start&#93;&#41;;<br>&nbsp;  b&#58;=strpos&#40;p,kogo&#41;;<br>&nbsp;  if b=nil then lstrposi&#58;=-1<br>&nbsp;           else lstrposi&#58;=b-p+start;{Любопытная весчь - b и p имеют тип Pchar, а результат выражения &#40;b-p&#41; -тип integer }<br>&nbsp; end;<br>end;<br><br>&nbsp; function lreplace&#40;kogo,chem,gde&#58;pstr&#41;&#58;integer;<br>&nbsp; const max=99;<br>&nbsp; var raz,t,p,nach,kol,res,dl,lenkogo,len,lenchem&#58;integer;<br>&nbsp;      z&#58;array&#91;0..max+1&#93; of integer;{//0 для служ целей}<br>&nbsp; begin<br>&nbsp;   kol&#58;=0;<br>&nbsp;   lenkogo&#58;=strlen&#40;kogo&#41;;<br><br>&nbsp;   p&#58;=lstrposi&#40;kogo,gde,0&#41;;<br>&nbsp;   while &#40;p&#60;&#62;-1&#41;and&#40;kol&#60;=max&#41; do begin<br>&nbsp;   inc&#40;kol&#41;;<br>&nbsp;    z&#91;kol&#93;&#58;=p;{запоминаем вхождение}<br>&nbsp;    p&#58;=lstrposi&#40;kogo,gde,p+lenkogo&#41;;{ищем след. вхождение стартуя от конца предыдущего}<br>&nbsp;   end;<br>&nbsp;   if kol=0 then begin lreplace&#58;=kol;exit;end;{заменять нечего}<br>&nbsp;   if kol=max+1 then begin write&#40;&#39;Нехватает памяти&#39;&#41;; lreplace&#58;=-1;exit;end;<br><br>&nbsp;   {//теперь заменяем}<br>&nbsp;   lenchem&#58;=strlen&#40;chem&#41;;<br>&nbsp;   len&#58;=strlen&#40;gde&#41;;<br>&nbsp;   dl&#58;=len+kol*&#40;lenchem-lenkogo&#41;;{будущая длинна строки gde}<br>&nbsp;   raz&#58;=lenchem-lenkogo;{разность lenchem и lenkogo &#58;&#41;}<br>&nbsp;    z&#91;0&#93;&#58;=-lenkogo;<br>&nbsp;    z&#91;kol+1&#93;&#58;=len+1;<br>&nbsp;   if lenchem&#62;lenkogo then{//c конца}<br>&nbsp;   begin {//dl&#62;len}<br>&nbsp;     {идём от конца к началу}<br>&nbsp;    for t&#58;=kol downto 0 do<br>&nbsp;    begin<br>&nbsp;     res&#58;=raz*t;<br>&nbsp;     for p&#58;=z&#91;t+1&#93;-1 downto z&#91;t&#93;+lenkogo do<br>&nbsp;      gde&#91;p+res&#93;&#58;=gde&#91;p&#93;;<br>&nbsp;    end;<br>&nbsp;   end {//then}<br>&nbsp;   else {//с начала}<br>&nbsp;   begin<br>&nbsp;     {//dl&#60;len}<br>&nbsp;     {идём от начала к концу}<br>&nbsp;    for t&#58;=0 to kol do<br>&nbsp;    begin<br>&nbsp;     res&#58;=raz*t;<br>&nbsp;     for p&#58;=z&#91;t&#93;+lenkogo to z&#91;t+1&#93;-1 do<br>&nbsp;      gde&#91;p+res&#93;&#58;=gde&#91;p&#93;;<br>&nbsp;    end;<br>&nbsp;   end;{//else}<br>&nbsp;   {теперь препишем строки}<br>&nbsp;   for t&#58;=1 to kol do<br>&nbsp;   begin<br>&nbsp;    nach&#58;=z&#91;t&#93;+raz*&#40;t-1&#41;;<br>&nbsp;    for p&#58;=nach to nach+lenchem-1 do<br>&nbsp;     gde&#91;p&#93;&#58;=chem&#91;p-nach&#93;;<br>&nbsp;   end;<br>&nbsp;   gde&#91;dl+1&#93;&#58;=#0;<br>&nbsp;   lreplace&#58;=kol;<br>&nbsp; end;<br><br>var p&#58;pstr;<br>begin<br>&nbsp;clrscr;<br><br>write&#40;&#39;Где будем заменять?&#39;&#41;; readln&#40;s&#41;;s&#58;=s+#0;<br>write&#40;&#39;Что будем заенять?&#39;&#41;; readln&#40;sub&#41;;sub&#58;=sub+#0;<br>write&#40;&#39;На что будем заменять?&#39;&#41;; readln&#40;zam&#41;;zam&#58;=zam+#0;<br><br>&nbsp;lreplace&#40;@sub&#91;1&#93;,@zam&#91;1&#93;,@s&#91;1&#93;&#41;;{@s&#91;1&#93; эта какбы string2Pchar}<br>&nbsp;p&#58;=@s&#91;1&#93;;<br>&nbsp;write&#40;&#39;Результат &#39;,p&#41;;{печатаем s как Pchar а не как string}<br>&nbsp;readln;<br>end.<br><!--c2--></td></tr></table><div class='postcolor'><!--ec2--><br>PS А есть способ оптималнее вышеописанного?<br>PSS Варианты типа - на асме будет быстрее НЕ предлагать, меня сейчас волнует алгоритмическая оптимизация. ]]></description>
        <author>Mixxx</author>
        <category>Pascal</category>
      </item>
	
      </channel>
      </rss>
	