Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2921 connectés 

  FORUM HardWare.fr
  Programmation
  C++

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°391742
haazheel
Posté le 13-05-2003 à 12:03:23  profilanswer
 

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?

mood
Publicité
Posté le 13-05-2003 à 12:03:23  profilanswer
 

n°391744
Taz
bisounours-codeur
Posté le 13-05-2003 à 12:05:00  profilanswer
 

strtok

n°391749
haazheel
Posté le 13-05-2003 à 12:10:14  profilanswer
 

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:

n°391855
haazheel
Posté le 13-05-2003 à 13:35:09  profilanswer
 

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?

n°391876
Taz
bisounours-codeur
Posté le 13-05-2003 à 13:53:40  profilanswer
 

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

n°391882
gatorette
Posté le 13-05-2003 à 13:55:46  profilanswer
 

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
n°391888
Taz
bisounours-codeur
Posté le 13-05-2003 à 13:59:11  profilanswer
 

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
n°391933
gatorette
Posté le 13-05-2003 à 14:19:12  profilanswer
 

++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
n°391942
Taz
bisounours-codeur
Posté le 13-05-2003 à 14:20:47  profilanswer
 

edit

n°405806
haazheel
Posté le 23-05-2003 à 12:46:45  profilanswer
 

++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
mood
Publicité
Posté le 23-05-2003 à 12:46:45  profilanswer
 

n°405836
Konar
Posté le 23-05-2003 à 13:07:09  profilanswer
 

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.    }

n°405847
SoWhatIn22
Posté le 23-05-2003 à 13:12:49  profilanswer
 

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.

n°405874
haazheel
Posté le 23-05-2003 à 13:22:45  profilanswer
 

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
n°405918
theshockwa​ve
I work at a firm named Koslow
Posté le 23-05-2003 à 13:39:03  profilanswer
 

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
n°405922
theshockwa​ve
I work at a firm named Koslow
Posté le 23-05-2003 à 13:40:24  profilanswer
 

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
n°405974
haazheel
Posté le 23-05-2003 à 14:15:20  profilanswer
 

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


---------------
Another .Net Blog
n°405980
theshockwa​ve
I work at a firm named Koslow
Posté le 23-05-2003 à 14:18:06  profilanswer
 

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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

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

 

Sujets relatifs
Imprimer une partie d une chaine de caracteres[ActionScript] Pb de chaine de caracteres
[ASP] fonction suppr espace fin de chaine[PHP] recuperer l'expression d'un agregat avec oracle 8
chaine d'entier "csv-style" -> int[][Delphi] Récupérer la taille d'un (gros) fichier
Récuperer la taille des dossiers pour examiner l'evolution[JAVA] [Résolu] Comment récuperer la position de la souris ?
[C]Taille de chaine de caractères dynamique...[Windows] qui transforme un Float en une chaine de char
Plus de sujets relatifs à : Récupérer les éléments d'une chaine


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR