Hash d'un string

Hash d'un string - C++ - Programmation

Marsh Posté le 04-06-2003 à 19:12:04    

Salut,
 
alors là je paye mon manque de connaissances de la STL et de string...
 
J'ai une chaine string qui peut avoir plusieurs formes:
 

xxx:yyy
xxx:aaa,bbb:yyy
xxx:aaa,bbb-........-ccc,ddd:yyy


 
Je voudrais pouvoir récupérer chacun de ces éléments pour remplir un vecteur de structures de ce type:
 

Code :
  1. vector<Possessions> TableauPossessions;


 
Et voilà la structure:
 

Code :
  1. struct Possessions
  2. {
  3. private:
  4.   struct PausePossessions
  5.   {
  6.   private:
  7.     int DebutPause;
  8.     int FinPause;
  9.   };
  10.   int DebutPossession,FinPossession;
  11.   vector<PausePossessions> TableauPauses; //Ce vecteur contient toutes les pauses d'une possession grâce à la structure PausePossessions
  12. public:
  13.   __fastcall Possessions();
  14. };


 
Au niveau des correspondances:
 

xxx => DebutPossession
yyy => FinPossession
aaa,ccc => DebutPause
bbb,ddd => FinPause


 
Comment je peux découper ma chaine pour pouvoir utiliser tout ça?
 
Merci!!


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

Marsh Posté le 04-06-2003 à 19:12:04   

Reply

Marsh Posté le 04-06-2003 à 20:11:22    

haazheel a écrit :

Salut,
 
Comment je peux découper ma chaine pour pouvoir utiliser tout ça?
 
Merci!!


 
au hasard... en faisant le prog qui correspond ?
 
c'est sur, c'est pas facile, faut penser, mettre le neurone en marche, se mettre devant un pc par ce beau temps, chercher un peu de doc si tu manques de connaissances sur la stl, c'est fatigant tout ca...

Reply

Marsh Posté le 04-06-2003 à 20:45:29    

Konar a écrit :


 
au hasard... en faisant le prog qui correspond ?
 
c'est sur, c'est pas facile, faut penser, mettre le neurone en marche, se mettre devant un pc par ce beau temps, chercher un peu de doc si tu manques de connaissances sur la stl, c'est fatigant tout ca...


 
Un prog qui correspond?
 
Tiens j'y avais pas pensé...
 
Effectivement, c'est une question que je pose sans m'être vraiment penché sur la doc de la STL, mais uniquement parce que je suis en train de coder autre chose...
 
Je ne postais pas juste pour avoir un code tout fait, mais seulement pour avoir quelques fonctions utiles histoire de commencer...
 
Bon, dans ce cas il ne me reste effectivement plus qu'à aller voir tout ça de plus près, et je reviendrais si j'ai d'autres problèmes plus pratiques...


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

Marsh Posté le 05-06-2003 à 21:39:14    

Bon, ben j'ai pondu ça:
 

Code :
  1. string::size_type start=0,
  2.                   end,
  3.                   startpause=0,
  4.                   endpause,
  5.                   caractPause=0;
  6. string chaine = "123:145,234-300,348:678";
  7. start = chaine.find_first_of(':', 0);
  8. end = chaine.find_last_of(':', string::npos);
  9. //Ici on récupère le début de la chaine (123)
  10. string Debut = chaine.substr(0, start);
  11. //Là la fin (678)
  12. string Fin = chaine.substr(end+1);
  13. //Si il y a quelque chose entre ':'
  14. if (start != end)
  15. {
  16.         //La chaine entre les ':' (145,234-300,348)
  17.         string Intermed = chaine.substr(start+1,end-start-1);
  18.         while ((startpause = Intermed.find_first_not_of("-", startpause)) != string::npos)
  19.         {
  20.                 endpause = Intermed.find_first_of("-", startpause);
  21.                 //Un doublon entre deux '-' (145,234) puis (300,348)
  22.                 string UnePause = Intermed.substr(startpause, endpause-startpause).c_str();
  23.                 caractPause = UnePause.find_first_of(',', 0);
  24.                 //Ce qu'il y a avant ',' (145) puis (300)
  25.                 string DebutPause = UnePause.substr(0, caractPause);
  26.                 //Après ',' (234) puis (348)
  27.                 string FinPause = UnePause.substr(caractPause+1);
  28.                 startpause = endpause;
  29.         }
  30. }


 
Ya moyen d'améliorer la bête?


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

Marsh Posté le 05-06-2003 à 21:42:56    

j'ai une question bete: t'as tenté avec un istringstream, ça serait pas mieux?

Reply

Marsh Posté le 05-06-2003 à 21:54:28    

++Taz a écrit :

j'ai une question bete: t'as tenté avec un istringstream, ça serait pas mieux?


 
Peut-être pas si bête que ça :D  
 
C'est quoi istringstream?


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

Marsh Posté le 05-06-2003 à 21:56:59    

bon, je viens de chercher là dessus, mais je vois pas comment l'utiliser... :(


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

Marsh Posté le 05-06-2003 à 22:00:49    

Code :
  1. string str="123:145,234-300,348:678";
  2. int a, b, c, d, e, f; // les nombres
  3. int sep; // le séparateur
  4. istringstream is(str);
  5. is >> a >> sep >> b >> sep >> c >> ..... >> e >> sep >> f;
  6. // et voilà

Reply

Marsh Posté le 05-06-2003 à 22:27:59    

++Taz a écrit :

Code :
  1. string str="123:145,234-300,348:678";
  2. int a, b, c, d, e, f; // les nombres
  3. int sep; // le séparateur
  4. istringstream is(str);
  5. is >> a >> sep >> b >> sep >> c >> ..... >> e >> sep >> f;
  6. // et voilà




 
T'es sur que sep est un int?
 
Effectivement c'est bien, mais comme j'ai dit dans mon premier post, la chaine n'est pas forcément de ce type, et peut contenir un nombre de doublons entre '-' variable!
 
Je peux imbriquer ton code dans une boucle?


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

Marsh Posté le 05-06-2003 à 22:56:05    

oui et oui

Reply

Marsh Posté le 05-06-2003 à 22:56:05   

Reply

Marsh Posté le 06-06-2003 à 17:08:13    

++Taz a écrit :

oui et oui


 
Correction: non et oui
 
En effet, si je laisse int sep, ya que la valeur de a qui est bonne... Les autres donnent toutes la même valeur fausse 1244960.
 
En revanche si je mets char sep, là ça marche impec...


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

Marsh Posté le 06-06-2003 à 17:15:03    

ché pas pourquoi j'ai dit oui et oui, mais bon, apparemment ça te convient. pour savoir si ça se passe bien un simple
 

Code :
  1. if(is >> a >> sep >> b)

suffit

Reply

Marsh Posté le 06-06-2003 à 17:23:02    

Quelle condition mettrais-tu dans le while pour parcourir toute la chaine?
 
J'ai bricolé là dessus, mais sans succès:
 

Code :
  1. while (i < //????)
  2.   {
  3.         is >> a >> sep;
  4.         Vector.push_back(a);
  5.         i++;
  6.   }


 
Merci!!


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

Marsh Posté le 06-06-2003 à 17:34:02    

et bien si tu est sur que chaque entier en suivi d'un séparateur un simple
 

Code :
  1. while(is >> a >> sep)


fonctionnera
 
ce la dit c'est bete que y ait des séparateurs, sinon un joli
 

Code :
  1. copy(istream_iterator<int>(is), istream_iterator<int>(), bask_inserter(vecteur));
  2. // voir meme
  3. vector<int> v(istream_iterator<int>(is), istream_iterator<int>());


 

Reply

Marsh Posté le 06-06-2003 à 17:42:52    

++Taz a écrit :

et bien si tu est sur que chaque entier en suivi d'un séparateur un simple
 

Code :
  1. while(is >> a >> sep)


fonctionnera
 
ce la dit c'est bete que y ait des séparateurs, sinon un joli
 

Code :
  1. copy(istream_iterator<int>(is), istream_iterator<int>(), bask_inserter(vecteur));
  2. // voir meme
  3. vector<int> v(istream_iterator<int>(is), istream_iterator<int>());


 
 


 
Quel aurait été l'effet de ce code? Remplir directement un vecteur?
 
Et il aurait pu s'utiliser selon quel type de string?


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

Marsh Posté le 06-06-2003 à 17:45:28    

oui et oui. et il s'utilise pas sur une string, mais sur un flux (un istream dont herite istringstream)
 
pour que ça fonctionne, il faut que chaque int soit séparé par un ou plusieurs blancs [ \t\n\t\r\v] (je crois que j'en oublie pas)


Message édité par Taz le 06-06-2003 à 17:45:36
Reply

Marsh Posté le 06-06-2003 à 18:08:44    

++Taz a écrit :

oui et oui. et il s'utilise pas sur une string, mais sur un flux (un istream dont herite istringstream)
 
pour que ça fonctionne, il faut que chaque int soit séparé par un ou plusieurs blancs [ \t\n\t\r\v] (je crois que j'en oublie pas)


 
Donc la string aurait été comment??
 
123 145 234 300 348 678
 
ou bien
 
123\n145\n234\n300\n348\n678


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

Marsh Posté le 06-06-2003 à 18:14:28    

l'une ou l'autre: comme j'ai dit, chaque valeur doit etre séparé d'un ou plusieurs séparateurs dont j'ai donné la liste

Reply

Sujets relatifs:

Leave a Replay

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