Récupérer les éléments d'une chaine

Récupérer les éléments d'une chaine - C++ - Programmation

Marsh Posté le 13-05-2003 à 12:03:23    

Salut,
 
alors, j'ai:
 

Code :
  1. AnsiString ListeFichiers = "0,1,5,10,13,45,";


 
Je voudrais créer une boucle qui me donne les différents éléments contenus entre les ,
 
J'ai essayé avec strchr, mais ça marche pas, car il me renvoie ce qui vient après la virgule...
 
Comment je peux faire ça?

Reply

Marsh Posté le 13-05-2003 à 12:03:23   

Reply

Marsh Posté le 13-05-2003 à 12:05:00    

strtok

Reply

Marsh Posté le 13-05-2003 à 12:10:14    

Merde alors, je l'avais vu dans la doc, mais quand j'ai vu token dans l'explication de la fonction, j'ai cherché autre part...
 
Merci!! :jap:

Reply

Marsh Posté le 13-05-2003 à 13:35:09    

Bon alors j'en suis là:
 

Code :
  1. vector<char*> VecListeIndex;
  2. char* Fichiers = ListeFichiers.c_str();
  3. char* PremierItem = ListeFichiers.c_str();
  4. VecListeIndex.push_back(strtok(PremierItem,"," ));
  5. while (Fichiers = strtok(strchr(Fichiers,','),"," ))
  6. {
  7.         VecListeIndex.push_back(Fichiers);
  8.         Fichiers = Fichiers+1;
  9. }


 
Ya pas de moyen de réduire?
 
Comme par exemple éviter de déclarer PremierItem pour récupérer juste le 1er élément?

Reply

Marsh Posté le 13-05-2003 à 13:53:40    

si, en passant aux std::string  [:samduloft]

Reply

Marsh Posté le 13-05-2003 à 13:55:46    

Si tu es en C++ et que tu utilises des strings, je ne pense pas que ce soit intéressant d'utiliser strtok. De plus, tu as au moins une erreur dans ton programme (bizarre qu'elle n'ai pas été reportée) : la fonction c_str() renvoie un const char * et non pas un char *.
 
Pour ma part, j'écrirais plutôt ton code comme ça :

Code :
  1. using namespace std;
  2. void Tokenizer( const string& fichiers, vector<string>& tokens, const char& token )
  3. {
  4. string::size_type curr_pos = 0;
  5. string::size_type new_pos;
  6. for(;;)
  7. {
  8. new_pos = fichiers.find( token, curr_pos );
  9. tokens.push_back( fichiers.substr( curr_pos, new_pos - curr_pos ) ); // le deuxième paramètre de substr est la taille !
  10. if( new_pos == string::npos )
  11. break;
  12. curr_pos = new_pos + 1; // '+1' en raison du token
  13. }
  14. }


 
edit: correction des bugs trouvés plus tard (merci ++Taz)


Message édité par gatorette le 13-05-2003 à 14:21:44

---------------
each day I don't die is cheating
Reply

Marsh Posté le 13-05-2003 à 13:59:11    

super mais ça ne fonctionne pas... faut passer le vecteur par reference et le char par reference. je teste pas mais dans l'idée, c'est ça
 
mais moi je verrai plutot (pas testé)
 

Code :
  1. const std::string SPACES(" \t\n\r\f\v" );
  2.   void tokenize(const std::string &str, std::vector<std::string> &tokens, const std::string &delimiters)
  3.   {
  4.     tokens.clear();
  5.     std::string::size_type start=0, end;
  6.     while((start=str.find_first_not_of(delimiters, start)) != std::string::npos)
  7.       {
  8.         end=str.find_first_of(delimiters, start);
  9.         tokens.push_back(str.substr(start, end-start));
  10.         start=end;
  11.       }
  12.   }


 
edit 2: doit fonctionner


Message édité par Taz le 13-05-2003 à 14:19:16
Reply

Marsh Posté le 13-05-2003 à 14:19:12    

++Taz a écrit :

...faut passer le vecteur par reference...


Ah oui, j'ai oublié... De même qu'en relisant ton code, je me suis rendu compte que j'avais fait une erreur dans le substr.
 
Ton code a pas l'air mal (surtout qu'il fait un strip des caractères) mais il y a au moins un problème :

Code :
  1. ...
  2. const std::string::size_type start=0;
  3. ...
  4. ... start=str ...


 
Edit : Grillé par l'edit...


Message édité par gatorette le 13-05-2003 à 14:19:52

---------------
each day I don't die is cheating
Reply

Marsh Posté le 13-05-2003 à 14:20:47    

edit

Reply

Marsh Posté le 23-05-2003 à 12:46:45    

++Taz a écrit :

Code :
  1. const std::string SPACES(" \t\n\r\f\v" );
  2.   void tokenize(const std::string &str, std::vector<std::string> &tokens, const std::string &delimiters)
  3.   {
  4.     tokens.clear();
  5.     std::string::size_type start=0, end;
  6.     while((start=str.find_first_not_of(delimiters, start)) != std::string::npos)
  7.       {
  8.         end=str.find_first_of(delimiters, start);
  9.         tokens.push_back(str.substr(start, end-start));
  10.         start=end;
  11.       }
  12.   }




 
Merci, avec du retard, mais j'avais oublié ce topic...
 
Sinon par rapport à ce code, je voulais savoir pourquoi mettre des const?
J'ai essayé sans et ça marche bien aussi, mais bon je les ai laissé parce que je me dis que tu ne les as pas mis là sans raison...


---------------
Another .Net Blog
Reply

Marsh Posté le 23-05-2003 à 12:46:45   

Reply

Marsh Posté le 23-05-2003 à 13:07:09    

haazheel a écrit :

Bon alors j'en suis là:
 

Code :
  1. vector<char*> VecListeIndex;
  2. char* Fichiers = ListeFichiers.c_str();
  3. char* PremierItem = ListeFichiers.c_str();
  4. VecListeIndex.push_back(strtok(PremierItem,"," ));
  5. while (Fichiers = strtok(strchr(Fichiers,','),"," ))
  6. {
  7.         VecListeIndex.push_back(Fichiers);
  8.         Fichiers = Fichiers+1;
  9. }


 


 
détail : ds le 1er appel a strtok, faut mettre ta chaine en question, mais pour parser toute cette chaine juska la fin, faut appeler strtok avec NULL comme 1er parametre.
 
exemple des man :
 

Code :
  1. char string[] = "A string\tof ,,tokens\nand some  more tokens";
  2.   char seps[]   = " ,\t\n";
  3.   char *token;
  4.   /* Establish string and get the first token: */
  5.    token = strtok( string, seps );
  6.    while( token != NULL )
  7.    {
  8.       /* While there are tokens in "string" */
  9.       printf( " %s\n", token );
  10.       /* Get next token: */
  11.       token = strtok( NULL, seps );
  12.    }

Reply

Marsh Posté le 23-05-2003 à 13:12:49    

haazheel a écrit :


Sinon par rapport à ce code, je voulais savoir pourquoi mettre des const?


 
Les variables déclarées en const ne peuvent pas être modifiées, sauf sur instruction explicite. Les arguments spécifiés en const dans le prototype de la fonction n'ont aucune raison d'être modifiés. S'ils le sont, alors le compilateur retournera une erreur et mettra donc le droit sur une erreur. Cela permet donc des vérifications à la compilation. Et ce qui est fait à la compilation n'est plus à faire ensuite.

Reply

Marsh Posté le 23-05-2003 à 13:22:45    

sowhatin22 a écrit :


 
Les variables déclarées en const ne peuvent pas être modifiées, sauf sur instruction explicite. Les arguments spécifiés en const dans le prototype de la fonction n'ont aucune raison d'être modifiés. S'ils le sont, alors le compilateur retournera une erreur et mettra donc le droit sur une erreur. Cela permet donc des vérifications à la compilation. Et ce qui est fait à la compilation n'est plus à faire ensuite.


 
ok, mais dans la fonction que Taz a écrite, str et delimiters ne sont pas modifiées, elles sont juste lues...
alors on peut peut-être se passer à la fois du const et du passage par référence non?


---------------
Another .Net Blog
Reply

Marsh Posté le 23-05-2003 à 13:39:03    

sowhatin22 a écrit :


 
Les variables déclarées en const ne peuvent pas être modifiées, sauf sur instruction explicite. Les arguments spécifiés en const dans le prototype de la fonction n'ont aucune raison d'être modifiés. S'ils le sont, alors le compilateur retournera une erreur et mettra donc le droit sur une erreur. Cela permet donc des vérifications à la compilation. Et ce qui est fait à la compilation n'est plus à faire ensuite.


 
:heink:
 
tu sous-entends quoi, là ?


---------------
last.fm
Reply

Marsh Posté le 23-05-2003 à 13:40:24    

haazheel a écrit :


 
ok, mais dans la fonction que Taz a écrite, str et delimiters ne sont pas modifiées, elles sont juste lues...
alors on peut peut-être se passer à la fois du const et du passage par référence non?


 
Les const, c'est utilisé comme garde-fou, pour être sur qu'on ne va pas se planter lamentablement et modifier une variable qui ne devrait pas l'être, et c'est aussi bien plus explicite pour les personnes qui te relisent ...
 
Edit : Donc on les garde, là ....


Message édité par theshockwave le 23-05-2003 à 13:41:13

---------------
last.fm
Reply

Marsh Posté le 23-05-2003 à 14:15:20    

ok pour les const...
 
mais le passage par référence n'est pas superflu?


---------------
Another .Net Blog
Reply

Marsh Posté le 23-05-2003 à 14:18:06    

haazheel a écrit :

ok pour les const...
 
mais le passage par référence n'est pas superflu?


 
:whistle: Je laisse quelqu'un qui est habitué à l'utilisation de std::string expliquer ... :D


---------------
last.fm
Reply

Sujets relatifs:

Leave a Replay

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