Fonction qui supprime un caractère donné dans une chaine en utilisant les pointeurs

Soyez le premier à donner votre avis sur cette source.

Snippet vu 5 469 fois - Téléchargée 32 fois

Contenu du snippet

la fonction décompose la chaine en caractères, construire une liste chainée avec ces caractères, supprime les caractère désirés puis reconstruction de notre chaine sans le caractère.

Source / Exemple :


function TForm1.SuppChar(var Ref: String; Ch: Char):String;
type PReference = ^TReference;
     TReference = record
                  Valeur : Char;
                  Svt    : PReference;
                  end;
var i: Integer;
    Tete,Ptr,P: PReference;
begin
Tete:=nil;
P:=nil;
for i:=1 to Length(Ref) do begin
        if Ref[i]<>Ch then begin
                Ptr:=P;
                New(P);
                P^.Valeur:=Ref[i];
                P^.Svt:= nil;
                if Tete = nil then
                        Tete:=P else begin
                                Ptr^.Svt:=P;
                                P^.Svt:=nil;
                                     end;
                           end;
                           end;
Ref:='';
Ptr:=Tete;
while Ptr<>nil do begin
Ref:=Ref + Ptr^.Valeur;
Ptr:=Ptr^.Svt;
end;
Dispose(P);
Result:=Ref;
end;

A voir également

Ajouter un commentaire Commentaires
Messages postés
600
Date d'inscription
samedi 8 juin 2002
Statut
Membre
Dernière intervention
6 avril 2010
1
Je n'étais pas encore venu foutre ma m**** lol
En mettant le caractère #0 au milieu d'une chaîne, fOxi, tu ne changes pas sa longueur. Exemple:

const s=#1#2#0#3#4;

Avec cet exemple de chaîne qui fait 5 caractères, le compilateur te dira que Length(s)=5 (la convention qu'un chaîne se termine au premier caractère #0 est vraie - et en partie seulement - pour le C mais pas en Delphi). De plus, même en C le fait qu'un char* contienne un \0 à un endroit ne signifie pas qu'il n'y a pas encore des données après, c'est juste une convention commode qu'utilisent ceux qui écrivent les API pour s'y retrouver.

Pour Delphi, une chaîne de type string est implémentée par une sorte d'interface sous-jacente (pour le ref-counting) avec un champ Length. C'est aussi le cas des tableaux dynamiques. C'est par exemple pour ça que si tu as:

var s:string;

@s ne pointe pas vers le premier caractère de la chaîne, mais vers cette fameuse interface de gestion des chaînes (idem pour les tableaux dynamiques). Tu peux calculer la taille en mémoire occupée par ce que Borland rajoutte (en plus des caractères) à une chaîne en calculant:

Integer(@s[1])-Integer(@s)

Je crois (mais ça demanderait à être revérifié) que ça fait 8 octets (tout simplement un entier integer contenant la longueur de la chaîne + un autre contenant le nombre de références à celle-ci).

Une version encore plus compacte de la fonction de Fred serait:

function SuppChar(const S : string; const C : char) : string;
var pS, pR : PChar; l : Integer;
begin
l := length(S)
SetLength(Result, l);
pS := PChar(S);
pR := PChar(Result);
While pS^ <> #0 do begin
if pS[0] <> C then begin
pR[0] := pS[0];
Inc(pR);
end else
Dec(l);
Inc(pS);
end;
SetLength(Result, l);
end;

Je ne pense pas que le Dec(l) soit trop gourmand en resources ^^

Dernière remarque, tu peux t'affranchir de faire Result:='' au début de la fonction car Delphi par défaut le fait pour toi (comme il le fait pour toutes les variables qui contiennent des interfaces "ref-counted").
Messages postés
4202
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
37
en effet fred ...

alors tout simplement le rajout de :

function SuppChar(const S : string; const C : char) : string;
var pS, pR : PChar;
begin
Result := '';
SetLength(Result, length(S));
pS := PChar(S);
pR := PChar(Result);
While pS^ <> #0 do begin
if pS[0] <> C then begin
pR[0] := pS[0];
Inc(pR);
end;
Inc(pS);
end;
pR[0] := #0;
end;

et hop la chaine est finie...
Messages postés
20
Date d'inscription
mercredi 15 mars 2006
Statut
Membre
Dernière intervention
19 juin 2008

Mais non, c'est seulement une blague, bien sûr qu'elle n'existe pas depuis 50 ans ... j'étais même pas né à l'époque ... et le Pascal non plus effectivement :)

C'était juste pour faire un peu d'ironie sur le temps passé à écrire ou à utiliser du code, et la possibilité qu'on puisse toujours avoir des bugs dedans ou qu'il existe une meilleure façon de l'écrire.

FRED
Messages postés
1606
Date d'inscription
samedi 10 juillet 2004
Statut
Membre
Dernière intervention
25 juillet 2014
11
désolé pour le triple post mais le seveur m'a renvoyer 2 fois une erreur de page!!
@+
jlen
Messages postés
1606
Date d'inscription
samedi 10 juillet 2004
Statut
Membre
Dernière intervention
25 juillet 2014
11
Fred_ca_Pulse---> faut pas pousser le bouchon trop loin : quand tu dis que ta fonction existe depuis 50 ans au moins elle est donc antérieure à l'invention du Pascal (en 1971 je cois) et de l'introduction de la notion de pointeur dans ce langage (debut des années 80 si ma mémoire est bonne) Très fort!!!

@+
jlen
Afficher les 23 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.