Extraire des variables à partir d'une chaine de caractère

Extraire des variables à partir d'une chaine de caractère - C++ - Programmation

Marsh Posté le 30-04-2008 à 19:36:38    

Alors voici ma deuxième question ;)
 
En fait je crois savoir qu'il est possible d'obtenir des variables à partir d'une chaine de caractère.
Je m'explique :
 
imaginons qu'on ai une chaine de caractère :    
char tableau[15] qui contient   "123 modele 954" et bien sur "\0"
 
Comment faire pour stocker 123 dans un int, modele dans une autre chaine de caractère et 954 dans un int ?
Il me semble qu'il est possible de faire (avec une fonction que je ne connais pas) : "%d %s %d" pour indiquer le type des variables.
 
J'espère que vous m'avez bien compris.
 
Merci d'avance.
 
 
PS : j'ai bien pensé a faire un strlen sur la chaine et utiliser les fonctions atof() mais le problème c'est que la longueur de la chaine peut grandement varier

Reply

Marsh Posté le 30-04-2008 à 19:36:38   

Reply

Marsh Posté le 30-04-2008 à 19:46:11    

std::ostringstream

Reply

Marsh Posté le 30-04-2008 à 22:07:24    

Merci beaucoup.
 
Par contre ce n'est pas plutot istringstream ?
Et ça marche avec les tableaux de caractères ou que sur les string ?

Reply

Marsh Posté le 30-04-2008 à 22:14:26    

Et est-ce qu'il est possible de faire une fonction qui lit les entiers d'une ligne tant qu'il n'atteint pas un zéro ?
 
Encore désolé pour ces questions de débutant.
 
Je vais essayer de faire un code.

Reply

Marsh Posté le 30-04-2008 à 22:25:46    

istringstream oui
 
sinon si tu as des trucs compelxes, boost::regex

Reply

Marsh Posté le 30-04-2008 à 22:30:07    

J'ai tenté comme ça mais il y a une erreur de compilation :
 

Code :
  1. istringstream stream1;
  2.         int initial = -1;
  3.         while(initial != 0)
  4.         {
  5.         int i = 0;
  6.         string string1(m_fichier[1][i]);
  7.         stream1.str(string1);
  8.         stream1 >> initial;
  9.         cout << "initial_1 : " << initial << endl; system("PAUSE" );
  10.         stream1.str( "" );
  11.         stream1.clear();
  12.         i = i+2;
  13.         }


 
 
La ligne de texte se présente comme ceci :

Citation :


1 2 0                 ou
10 23 35 733 0    ou
1 0                    ou
0                      ou


Message édité par sebdu94 le 30-04-2008 à 22:32:31
Reply

Marsh Posté le 30-04-2008 à 23:34:23    

J'ai trouvé !!! :D

Reply

Marsh Posté le 03-05-2008 à 17:20:13    

Citation :

Il me semble qu'il est possible de faire (avec une fonction que je ne connais pas) : "%d %s %d" pour indiquer le type des variables.


sscanf()
 
Fonction très puissante (elle sait même faire qlq expressions régulières simples comme [a-z]+ ou [^0-9]{3}) mais très complexe et à n'utiliser que si on sait exactement ce que l'ont fait.
Plus puissante que std::istringstream mais moins gracieuse, plus complexe... et pur C
boost::regex c'est le top mais il faut se trinbaler boost, or ton problème semble être un exo d'étudiant, boost ça fait un peu lourd juste pour ça.
 
un exellent article sur sscanf qui peut bien souvent remplacer boost::regex dans des cas simples :
http://xrenault.developpez.com/tutoriels/c/scanf/

Reply

Marsh Posté le 03-05-2008 à 19:49:30    

pur C oui mais le topic est dans la cat. C++ :o

Reply

Marsh Posté le 03-05-2008 à 21:23:50    

mais il n'y a pas d'équivalent à sscanf en vrai C++, donc ça reste pertinent de s'en servir pour les expressions régulières. Après si c'est pour lire un simple entier, je plussoie le istringstream ;)

Reply

Marsh Posté le 03-05-2008 à 21:23:50   

Reply

Marsh Posté le 03-05-2008 à 22:03:13    

je reve d'un boost::format pour les entrées et non les sorties en fait

Reply

Sujets relatifs:

Leave a Replay

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