2017-03-23 3 views
0

J'essaie de remplacer un mot dans une chaîne sans utiliser StringReplace, une idée de comment?Chaîne manuelle Remplacer (Free Pascal)

J'utilise 4 zones de texte.

1er boîte est le texte original 2ème case est le mot de recherche 3ème case est le remplacer mot boîte 4ième est le texte final

var 
    Form1: TForm1; 
    result: string; 
    rep: string; 
    i, iCount: integer; 


procedure TForm1.Button1Click(Sender: TObject); 
begin 
    Edit4.Text := StringReplace(Edit1.Text, Edit2.Text, Edit3.Text, [rfReplaceAll, rfIgnoreCase]); 
    begin 
    result := Edit4.Text; 
    rep := Edit3.Text; 
    iCount := 0; 

    for i := 1 to length(result) do 
    begin 
     if result[i] = rep then 
     inc(iCount); 
    end; 
    end; 
    label5.Caption := ('There was ' + IntToStr(iCount) + ' changes made'); 
end; 
+1

S'il vous plaît nous montrer ce que vous avez essayé jusqu'à présent. –

+1

Mis à jour ** Il ne semble pas vouloir compter avec la fonction de remplacement de chaîne –

+0

Vous dites: * ... sans utiliser StringReplace *, mais votre code ** utilise ** 'StringReplace()'? Quel est le véritable problème? Voulez-vous éviter 'StringReplace()' ou voulez-vous avoir le nombre de remplacements ou les deux? –

Répondre

1

Cela devrait faire quelque chose comme vous voulez:

program mystringreplacetest; 

{$mode objfpc}{$H+} 

uses 
    {$IFDEF UNIX}{$IFDEF UseCThreads} 
    cthreads, 
    {$ENDIF}{$ENDIF} 
    Classes, SysUtils; 


function MyStringReplace(const Input, Find, Replace : String; out Count : Integer) : String; 
var 
    P : Integer; 
begin 
    Count := 0; 

    Result := Input; 

    repeat 
    P := Pos(Find, Result); 
    if P > 0 then begin 
     Delete(Result, P, Length(Find)); 
     Insert(Replace, Result, P); 
     Inc(Count); 
    end; 
    until P = 0; 
end; 


var 
    S : String; 
    Count : Integer; 
begin 
    S := 'a cat another cat end'; 
    S := MyStringReplace(S, 'cat', 'hamster', Count); 
    writeln(S, ' : ', Count); 
    readln; 
end. 

Dans le cas où c'est devoirs, j'ai laissé quelques choses à faire:

  • Insensibilité à la casse

  • Évitant répétées balayant les caractères jusqu'à la première occurrence de Find.

De toute évidence, il serait bon que vous lisez sur la fonction Pos et les procédures Delete et Insert pour référence ultérieure.

PS: Attention: ce code contient un piège pour les imprudents. Considérez ce qui se passe lorsque la chaîne Replace contient la chaîne Find (par exemple, Find = 'cat' et Replace = 'catflap'). Pouvez-vous voir quel serait le problème et comment l'éviter?

+0

Vous étiez plus rapide :). J'essayais de formuler une réponse sans code, au cas où ce serait le devoir, mais il aurait été beaucoup plus rapide d'écrire le code. À votre santé! –

+0

Avez-vous répondu à cette question? – MartynA