Operation sur des strings

Operation sur des strings - Delphi/Pascal - Programmation

Marsh Posté le 02-04-2003 à 17:34:59    

Existe-il une fonction de type strtok (en C) en Delphi (ou Pascal).
 
Cette fonction permet de prendre dans une chaine une partie de la chaine jusqu'à un caractere
 
exemple :
 
'toto tata !meme'
 
le caractere de "separation" est ' '
 
Et il devrait me sortir 'toto'
 
 
ça existe ? ou je dois me taper à prendre la position du premier espace, de stocker l'index, de prendre la chaine de 0... à X, etc, etc ...


Message édité par Shogun2002 le 02-04-2003 à 17:35:52
Reply

Marsh Posté le 02-04-2003 à 17:34:59   

Reply

Marsh Posté le 02-04-2003 à 17:40:54    

Bon je viens de voir une methode de antp que je vais tester ....

Reply

Marsh Posté le 02-04-2003 à 17:44:21    

Reply

Marsh Posté le 02-04-2003 à 17:46:58    

Bravo antp ... :sol:  
 
avec cette technique :
 
liste := TStringList.Create;
liste.Text := StringReplace(lesSelects.Items[Exportation.itemindex],' ', #13#10, [rfReplaceAll]);
 
 
Allez hop je vais le garder au chaud ....

Reply

Marsh Posté le 02-04-2003 à 17:55:03    

Y a moyen de faire un truc plus propre, mais à moins de devoir appeler ce code des centaines de fois je ne suis pas sûr que ça en valle la peine :)

Reply

Marsh Posté le 02-04-2003 à 18:09:23    

regarde aussi du coté des unités spécialisés comme faststrings tu sentiras la différence si tu dois manipuler beaucoup de données.

Reply

Marsh Posté le 02-04-2003 à 22:56:10    

function delimite({in}chaine:string):string;
var indice:integer;
 
begin
     indice:=pos(' ',chaine);
     delimite:= copy(chaine,1,indice);      
end;
 
tu te fais ta fonction ds un coin et t'es tranquille :)


Message édité par GuYzMo le 02-04-2003 à 22:57:22
Reply

Marsh Posté le 02-04-2003 à 23:23:21    

les chaînes passées en param vaut mieux mettre "const" devant, question de perf (passage par adresse au lieu de passage par valeur)


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 03-04-2003 à 09:32:40    

Rebonjour
 
Est que avec la methode de antp on peut utiliser 2 délimiteurs dans une meme chaine ?
 
ex :  ' ' et '='

Reply

Marsh Posté le 03-04-2003 à 09:36:31    

Ex : Prendre toutes les chaines (et les stocker dans un TStringList) compris entre les caracteres '=' et ' ', et non l'inverse.

Reply

Marsh Posté le 03-04-2003 à 09:36:31   

Reply

Marsh Posté le 03-04-2003 à 09:42:09    

oui, en faisant encore plus bourrin :
 
liste.Text := StringReplace(StringReplace(chaine, delim1, #13#10, [rfReplaceAll]), delim2, #13#10);
 
:D
 
edit: ha zut j'avais pas vu le 2e message
bhen là tu fais un truc genre :
 

Code :
  1. function GetNextStr(const d1, d2: string; var s: string): string;
  2. var
  3.   p1: Integer;
  4. begin
  5.   p1 := Pos(d1, s);
  6.   p2 := Pos(d2, s);
  7.   if (p1 = 0) or (p2 = 0) then
  8. begin
  9.     Result := '';
  10.     s := '';
  11.     Exit;
  12.   end;
  13.   // si p2 n'est pas trouvé, on ignore le reste. S'il faut garder
  14.   // le reste, enlever p2 du if ci-dessus et enlever le commentaire ci-dessous:
  15.   //if p2 = 0 then
  16.   //  p2 := Length(s);
  17.   Result := Copy(s, p1 + 1, p2 - p1 - 1);
  18.   Delete(s, 1, p2);
  19. end;


 

Code :
  1. while s <> '' do
  2.   liste.Add(GetNextStr('=', ' ', s));


 
un truc du genre, à vérifier


Message édité par antp le 03-04-2003 à 09:59:38
Reply

Marsh Posté le 03-04-2003 à 09:45:22    

Ok je teste !

Reply

Marsh Posté le 03-04-2003 à 09:54:19    

liste.Text := StringReplace(StringReplace(chaine, delim1, #13#10, [rfReplaceAll]), delim2, #13#10, [rfReplaceAll]);
 
Bon je teste la seconde methode  

Reply

Marsh Posté le 03-04-2003 à 09:57:40    

j'ai modifié le truc pcq dans ce que j'avais mis s'il ne trouvait pas le second délimiteur il prenait tout jusqu'à la fin, alors que j'imagine qu'il faut uniquement ce qui est entre '=' et ' '
(cf commentaire)

Reply

Marsh Posté le 03-04-2003 à 10:05:16    

Nickel les deux méthodes !
 
Mais lequel vais-je choisir  :??:  
 
Allez la premiere ... elle me prend des chaines que j'aurais peut-etre besoin !
 
 
 
Merci !

Reply

Marsh Posté le 03-04-2003 à 10:09:39    

à mon avis la bonne est celle avec les deux if séparés ;)

Reply

Marsh Posté le 03-04-2003 à 10:36:16    

Avec la 2eme methode c normal qu'il me met des blanc dans la TStringList entre chaque valeur ...
 
Pourtant je n'ai jamais de ' ' entre '=' et ' '


Message édité par Shogun2002 le 03-04-2003 à 10:36:35
Reply

Marsh Posté le 03-04-2003 à 10:37:58    

comment ça des blancs entre chaque valeur ?
poste un exemple de chaîne à découper

Reply

Marsh Posté le 03-04-2003 à 10:44:58    

(cl.tu_code=91 OR cl.tu_code=76 OR cl.tu_code=88 OR cl.tu_code=51 OR cl.tu_code=12)
 
Logiquement je devrais avoir que les valeurs ....
 
Sauf pour le dernier ... mais ça je vais m'en occuper


Message édité par Shogun2002 le 03-04-2003 à 10:45:20
Reply

Marsh Posté le 03-04-2003 à 10:56:08    

ha ouais mince, justement ici y a des espaces en plus de ceux qui délimitent :
 

Code :
  1. function GetNextStr(const d1, d2: string; var s: string): string;
  2. var
  3.   p1, p2: Integer;
  4. begin
  5.   p1 := Pos(d1, s);
  6.   if p1 = 0 then
  7.   begin
  8.     Result := '';
  9.     s := '';
  10.     Exit;
  11.   end;
  12.   Delete(s, 1, p1);
  13.   p2 := Pos(d2, s);
  14.   if p2 = 0 then
  15.     p2 := Length(s);
  16.   Result := Copy(s, 1, p2 - 1);
  17.   Delete(s, 1, p2);
  18. end;


Message édité par antp le 03-04-2003 à 10:56:20
Reply

Marsh Posté le 03-04-2003 à 10:59:24    

Merci !

Reply

Marsh Posté le 03-04-2003 à 12:11:57    

Tiens par hasard...
Oui encore moi   :sweat:  
 
Comment convertir un WideString en string ?

Reply

Marsh Posté le 03-04-2003 à 12:15:21    

g essayé fromWide mais ça marche pas ...

Reply

Marsh Posté le 03-04-2003 à 12:43:18    

"Strings can be explicitly cast to a different string type (see Typecasts)."
 
bah essaie la solution bourrin s := string(ws); où ws = le WideString

Reply

Marsh Posté le 03-04-2003 à 13:25:13    

Marche pas => "violation d'accés" ...
 
 
Merci quand même.
 

Reply

Marsh Posté le 03-04-2003 à 14:32:24    

De toute façon si ton widestring est trop grd tu peut avoir que des probs, à moins de le mettre ds différents string

Reply

Marsh Posté le 03-04-2003 à 14:36:47    

ouais enfin string (qui prend AnsiString à moins de modifier une option dans Delphi) c'est limité à 2 Go, donc avant de dépasser ça...

Reply

Marsh Posté le 03-04-2003 à 14:46:42    

autant pr moi ;)

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed