Создайте функцию замены строк в Delphi.
Примечание редактора: функция StringReplace в Delphi специально разработана для удовлетворения этой потребности. Но мы же публикуем и эту статью — по крайней мере автор предлагает альтернативу, а дух исследования следует поощрять! Это моя первая статья здесь, и, поскольку мой уровень не очень высок, я обсужу базовый, но очень практический вопрос, надеюсь, это поможет вам. Друзья, которые использовали VB или ASP, знают, что в VB есть очень практичная функция замены. Ее функция заключается в замене строки, соответствующей подстроке (также называемой строкой шаблона), в строке указанной строкой. Например, есть такая строка: s:='apple is apple!'. После использования функции replace для замены (s,'apple','box') s становится 'box is box!'. Соответственно изменяется и длина строки. Это очень полезная функция. Всем известно, что операторы структурированных запросов sql часто используются при разработке систем баз данных, и этот оператор чувствителен к некоторым символам, например, к одинарным кавычкам, если в кавычках оператора sql присутствует одинарная кавычка (поскольку одинарные кавычки). используются в кв. l) программа будет вызывать неожиданные ошибки и даже может быть использована другими для создания серьезных уязвимостей безопасности в системе (это знаменитая атака с помощью SQL-инъекции, я думаю, все еще помнят то, что было обнаружено ранее на форуме CSDN). Это лазейка. ). В это время вам необходимо заменить одинарные кавычки другими строками или пустыми строками во время операций с базой данных, а затем заменить их обратно при чтении данных, чтобы одинарные кавычки можно было записать в запись данных без ошибок. Однако в Delphi я не нашел подобной функции (может, не нашел?), что было очень неудобно, поэтому написал сам, которая будет гораздо удобнее при дальнейшей разработке системы баз данных. После стольких глупостей вот код, с комментариями его будет легче понять.
PROcedure replace(var s:string;const SourceChar:pchar;const RChar:pchar // Первый параметр — исходная строка, второй — строка шаблона, а третий — строка замены var ta,i,j: целое число ; m,n,pn,sn:целое; SLen,SCLen,RCLen:integer;//SLen представляет длину исходной строки, SCLen представляет длину, переданную в режиме, RCLen представляет длину строки замены IsSame:integer; newp:array of char;// Используется для сохранить замененный массив символов. start SLen:=strlen(pchar(s));SCLen:=strlen(SourceChar);RCLen:=strlen(RChar); j:=pos(string(SourceChar),s); s:=s+chr(0);ta:=0;i:=j; while s[i]<>chr(0) do // Этот цикл использует ta подсчитывает, сколько раз строка шаблона появляется в исходной строке. Begin n:=0;IsSame:=1; for m:=i to i+SCLen-1 do Begin if m>SLen then Begin IsSame:=0;break ; конец; если s[m]<>sourceChar[n] then start IsSame:=0;break end; n:=n+1; end; если IsSame=1, то start ta:=ta+1;i:=m; i:=i+1; end; если j>0, то начать pn:=0;sn:=1; setlength(newp,SLen-ta*SCLen+ta*RCLen+1);// Выделяем длину newp, +1 означает, что за ним стоит терминатор #0,
а s[sn]<>chr(0) делаем // В основном цикл, начните замену Begin n:=0;IsSame:=1; for m:=sn to sn+SCLen-1 do // Сравниваем, совпадает ли подстрока со строкой шаблона Begin if m>SLen then Begin IsSame:=0;break; if s[m]<>sourceChar[n] then Begin IsSame:=0;break end; n:=n+1; if IsSame=1 then// То же самое для от m:=0 до RCLen-1 do start newp[pn]:=RChar[m];pn:=pn+1 ; sn:=sn+SCLen end else Begin ;
// Другое newp[pn]:=s[sn]; pn:=pn+1; sn:=sn+1; end ; newp[pn]:=#0; s:=string(newp); / reset , замена завершена! конец; конец; Фактически, это базовая проблема структуры данных. Сегодня, когда мы часто программируем с элементами управления перетаскиванием, нам следует просто попрактиковаться в структуре данных. Конечно, эта функция написана не оптимально. Я тестировал замену строки из 10 000 слов, и это заняло полсекунды. Временная сложность все еще относительно высока. Если у вас есть лучший способ, пожалуйста, обсудите его!