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

  FORUM HardWare.fr
  Programmation
  C++

  Hash d'un string

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Hash d'un string

n°416828
haazheel
Posté le 04-06-2003 à 19:12:04  profilanswer
 

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
mood
Publicité
Posté le 04-06-2003 à 19:12:04  profilanswer
 

n°416866
Konar
Posté le 04-06-2003 à 20:11:22  profilanswer
 

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

n°416879
haazheel
Posté le 04-06-2003 à 20:45:29  profilanswer
 

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
n°418483
haazheel
Posté le 05-06-2003 à 21:39:14  profilanswer
 

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
n°418489
Taz
bisounours-codeur
Posté le 05-06-2003 à 21:42:56  profilanswer
 

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

n°418522
haazheel
Posté le 05-06-2003 à 21:54:28  profilanswer
 

++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
n°418525
haazheel
Posté le 05-06-2003 à 21:56:59  profilanswer
 

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


---------------
Another .Net Blog
n°418542
Taz
bisounours-codeur
Posté le 05-06-2003 à 22:00:49  profilanswer
 

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à

n°418577
haazheel
Posté le 05-06-2003 à 22:27:59  profilanswer
 

++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
n°418607
Taz
bisounours-codeur
Posté le 05-06-2003 à 22:56:05  profilanswer
 

oui et oui

mood
Publicité
Posté le 05-06-2003 à 22:56:05  profilanswer
 

n°419924
haazheel
Posté le 06-06-2003 à 17:08:13  profilanswer
 

++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
n°419936
Taz
bisounours-codeur
Posté le 06-06-2003 à 17:15:03  profilanswer
 

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

n°419958
haazheel
Posté le 06-06-2003 à 17:23:02  profilanswer
 

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
n°419991
Taz
bisounours-codeur
Posté le 06-06-2003 à 17:34:02  profilanswer
 

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>());


 

n°420007
haazheel
Posté le 06-06-2003 à 17:42:52  profilanswer
 

++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
n°420012
Taz
bisounours-codeur
Posté le 06-06-2003 à 17:45:28  profilanswer
 

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
n°420041
haazheel
Posté le 06-06-2003 à 18:08:44  profilanswer
 

++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
n°420046
Taz
bisounours-codeur
Posté le 06-06-2003 à 18:14:28  profilanswer
 

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


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

  Hash d'un string

 

Sujets relatifs
[STL] class string et comparaison non case-sensitive[RESOLU] kestion a la kon : recherche de String ds un FILE
Convertir un stringstring tokenizer
Convertir un float en string en C++difference entre un StringBuffer et une String
y a-t-il une taille limite pour un .string ou un .ascii?[PHP] conversion de données (manipulations de string inside)
comment passer le caractère & dans une query string?String de la taille d'un champ d'une table
Plus de sujets relatifs à : Hash d'un string


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