Votre question

c++ strtok n'accepte pas les chaines[512]

Tags :
  • string
  • Programmation
Dernière réponse : dans Programmation
Anonyme
3 Février 2008 20:03:26

Bnjour !

Voila ce que j'ai dans le code :

  1. char buffer[512] ;
  2. char sousbuffer[512] ;
  3. char sousbuffer1[512] ;
  4. char sousbuffer2[512] ;
  5.  
  6. ....
  7.  
  8. sousbuffer = strtok(buffer,"µ"); //remplissage des sousbuffers
  9. sousbuffer1 = strtok(buffer,"µ");
  10. sousbuffer2 = strtok(buffer,"µ");


Or le comilateur me reponds :
Citation :
incompatible types in assignment of `char*' to `char[512]'


La question est comment je peux m'en sortir en gardant des buffers de 512 ???

PS: on voit encore la puissance du VB ou un simple
Split(buffer, "µ") suffirait ! Et pas la peine de créer 10 000 de sousbuffers ! Il suffirait de créer un tableau ! Alors qu'en Cpp il faudra créer un tableau des tableaux ^^

Autres pages sur : strtok accepte chaines 512

4 Février 2008 16:44:54

c'est pas vraiment ce que j'appellerai puissance mais passons, chacun son avis après tout :) 

pour ton prog en c, strtok modifie la chaine donné en argument et retourne un pointeur vers la dernière partie trouvée:
  1. char buffer[512];
  2. char *sousbuffer1;
  3. char *sousbuffer2;
  4. char *sousbuffer3;
  5. //....
  6. sousbuffer = strtok(buffer,"µ" ); //remplissage des sousbuffers
  7. sousbuffer1 = strtok(NULL,"µ" );
  8. sousbuffer2 = strtok(NULL,"µ" );


  1. #include <stdio.h>
  2. #include <string.h>
  3. int main ()
  4. {
  5. char str[256]="1 2 3 4";
  6. char *pch = strtok (str," ");
  7. while (pch != NULL)
  8. {
  9. printf ("%s\n",pch);
  10. pch = strtok (NULL, " ");
  11. }
  12. return 0;
  13. }
Anonyme
4 Février 2008 16:52:02

Merci de repondre, j'ai posté ca hier, mais depuis il s'est passé pas mal de choses.

Maintenant je cherche a faire un tableau dynamique qui coupperait buffer en plusieurs sous buffers, ce qui depends du charactére de separation.

Exemple :

chaine qui arrive dans buffer : "cmdµarg1µarg2µarg3µ

la fonction que je cherche identifie combien il y a de sousbuffers a créer, 4 dans cet exemple, puis remplis :

sousbuffer[0]="cmd"
sousbuffer[1]="arg1"
...
sousbuffer[3]="arg3"

En VB cette fonction est Split, mais en C++ je vois pas part la créer soit meme non ?
4 Février 2008 17:38:20

strtok et cie sont du C, si tu veux utiliser des tableaux dynamiques en C, il faut utiliser malloc et realloc, ca donnerait un truc de ce genre:
  1. char ** split (char *str, const char *delim)
  2. {
  3. char **result = (char **) calloc (1, sizeof (char *));
  4. unsigned int i=0;
  5. char *pch = strtok (str," " );
  6. while (pch != NULL)
  7. {
  8. result = (char **) realloc (result, (i+2) * sizeof (char *));
  9. result[i] = pch;
  10. i++;
  11. pch = strtok (NULL, " " );
  12. }
  13. result[i]=NULL;
  14. return result;
  15. }

(en rajoutant les controle d'erreurs et ne pas oublier de libérer la mémoire)
cette fonction modifie la chaine passée en paramètre

en C++:
  1. #include <string>
  2. #include <iostream>
  3. #include <vector>
  4.  
  5. using namespace std;
  6.  
  7. vector <string> split (string str, char delim)
  8. {
  9. vector<string> str_list;
  10. istringstream iss(str);
  11. string token;
  12. while (getline (iss, token, delim))
  13. {
  14. str_list.push_back (token);
  15. }
  16. return str_list;
  17. }
  18.  
  19.  
  20. int main()
  21. {
  22. string buffer="1 2 3 4";
  23. vector<string> tab;
  24. unsigned int i=0;
  25. tab = split (buffer, ' ');
  26. for (i=0; i<tab.size (); i++)
  27. cout << tab[i] << endl;
  28. return 0;
  29. }


sinon, tu as aussi la classe boost/tokeniser
Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS