FONCTION QUI SUPPRIME UN CARACTÈRE DONNÉ DANS UNE CHAINE EN UTILISANT LES POINTE

Signaler
Messages postés
3826
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
10 mai 2021
-
Messages postés
600
Date d'inscription
samedi 8 juin 2002
Statut
Membre
Dernière intervention
6 avril 2010
-
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/35940-fonction-qui-supprime-un-caractere-donne-dans-une-chaine-en-utilisant-les-pointeurs

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
Afficher les 23 commentaires