Découpage chaine de caractère

Découpage chaine de caractère - C - Programmation

Marsh Posté le 19-01-2012 à 17:28:05    

Bonjour à tous,
 
Voila j'ai fait une petite fonction pour découper une chaine de caractère en utilisant strtok () selon un séparateur,sauf que j'affiche tous d'un coup. comment je pourrai faire pour stocker le retour de strtok () dans un tableau de chaine de caractère, afin de pouvoir utiliser par la suite chaque partie de la chaine de caractère, comme par exemple pour la chaine de caractère"hello \t world" récupéré hello dans la première case et world dans la deuxième, donc un tableau qui s'adapte à chaque chaine de caractère, mais je ne sais pas comment faire, si quelqu'un peut m'aider svp.
 
voila le code:
 

Code :
  1. int main ()
  2.     {
  3.    char buffer[]= "hello\t world";
  4.    fct_decoupe(buffer);
  5.     return 0;
  6.     }
  7. char fct_decoupe(char buffer[])
  8. {
  9.  char *pch = strtok (buffer,"\t" );
  10.  while (pch != NULL)
  11.  {
  12.  printf ("%s\n",pch);
  13.  pch = strtok (NULL, "\t" );
  14.  }
  15.  return 0;
  16. }


 
Merci d'avance.


Message édité par filoo85 le 19-01-2012 à 17:43:56
Reply

Marsh Posté le 19-01-2012 à 17:28:05   

Reply

Marsh Posté le 19-01-2012 à 21:23:41    

bonjour,
tu fais taille=strlen(pch) pour avoir la taille du token puis nouvellechiane=malloc((taille +1)*sizeof(char)), puis strcpy(nouvellechaine, pch) et ca devrais le faire


---------------
Seul Google le sait...
Reply

Marsh Posté le 20-01-2012 à 16:09:56    

Merci pour ta réponse ça marche.

Reply

Marsh Posté le 21-01-2012 à 11:23:44    

filoo85 a écrit :

breizhbugs a écrit :

bonjour,
tu fais taille=strlen(pch) pour avoir la taille du token puis nouvellechiane=malloc((taille +1)*sizeof(char)), puis strcpy(nouvellechaine, pch) et ca devrais le faire


 
Merci pour ta réponse ça marche.


 
Salut
Si tu es sur un système récent tu peux utiliser strdup() qui fait tout ça tout seul.
 
De plus, si tu n'as pas perdu ta chaine originelle alors c'est inutile de "recopier" l'intégralité des sous-chaines car strtok() l'a modifiée en y insérant des '\0' là où il y avait le séparateur. Donc suffit juste de mémoriser chaque pointeur renvoyé, ils pourront être réutilisés comme des chaines entières...

Message cité 1 fois
Message édité par Sve@r le 21-01-2012 à 11:27:35
Reply

Marsh Posté le 21-01-2012 à 12:52:24    

Sve@r a écrit :


 
Merci pour ta réponse ça marche.


 
Salut
Si tu es sur un système récent tu peux utiliser strdup() qui fait tout ça tout seul.
 
De plus, si tu n'as pas perdu ta chaine originelle alors c'est inutile de "recopier" l'intégralité des sous-chaines car strtok() l'a modifiée en y insérant des '\0' là où il y avait le séparateur. Donc suffit juste de mémoriser chaque pointeur renvoyé, ils pourront être réutilisés comme des chaines entières...[/quotemsg]C'est aussi ce que j'aurais fait.
On peut même éviter de mémoriser les pointeurs, si on se rappelle l'adresse de fin (ou la la longueur) de la chaîne originelle, et qu'on avance de sous chaîne en sous chaîne, tant qu'on a pas dépassé l'adresse de fin (la ça dépend de ce qu'on veut faire avec les sous chaines).
A+,


Message édité par gilou le 21-01-2012 à 12:55:35

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 21-01-2012 à 13:18:34    

Effectivement, j'avais oublié le strdup qui le fait très bien.
Toutefois l'inconvénient de strdup() à mon avis est qu'il cache le malloc() sur la nouvelle chaine et qu'on risque de moins penser à appeler le free().
Enfin bref faut bien lire la doc quoi...


---------------
Seul Google le sait...
Reply

Marsh Posté le 21-01-2012 à 14:33:32    

L'inconvénient majeur de strdup, c'est qu'il était pas dispo dans toute les implems. Fallait se faire le sien sinon (trivial).
C'est peut être plus le cas de nos jours.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Sujets relatifs:

Leave a Replay

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