IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

detection d'un int sous un format string?


Sujet :

C++

  1. #21
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Par défaut
    Citation Envoyé par jblecanard Voir le message
    Peut être parce que tu as lu mon délire avec Spirit .
    lui je l'avais meme pas lu car il etait plus qu'indigeste...

    Citation Envoyé par jblecanard Voir le message
    Il faut prendre l'autre, et si tu ne comprend pas une partie, je (ou un autre membre) t'expliqueras.
    je vais jeter un oeil pour ma culture personnelle mais je t'avous qu'il y a de fortes chance que je conserve la 1ere version car en plus des elements que je t'ai cité il y a aussi el fait que 2 amis vont avoir mon programme entre les mains et il faut qu'ils le comprennent vite (il sont aussi tres debutant)

  2. #22
    Membre Expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Par défaut
    Qu'à celà ne tienne ! En avant pour quelques explications :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    void parserChaine(const std::string& iChaine, std::vector<std::string>& lettres, std::vector<double>& nombres)
    {
    On crée une fonction qui pourra nous resservir. J'ai fait une fonction libre, mais tu peux (et tu vas sûrement) en faire une méthode d'un objet.
    Les esperluettes (en gras), indiquent qu'on passe les vecteurs par référence. Cela va nous permettre de les modifier sans avoir à gérer la lourdeur de pointeur.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    std::ostringstream accumulator;
    std::locale loc;
    L'objet accumulator est un objet dans lequel on peut écrire comme dans std::cout, que tu dois connaître. Cela va nous permettre de facilement faire la concaténation de caractères pour les mettre dans une chaîne.
    L'objet loc va tenter de détecter la configuration linguistique de l'utilisateur. Tu n'as pas besoin de te préoccuper de son fonctionnement, on a juste besoin de lui pour isalpha et isdigit.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for(std::string::const_iterator caractere = iChaine.begin(); caractere != iChaine.end(); caractere++)
    	{
    Cette boucle utilise le mécanisme des itérateurs. Cela permet de parcourir un conteneur (une chaîne, une liste, un vector) sans avoir à se préoccuper d'une notion d'indice. Ceci parcourt la chaîne caractère par caractère. Pour accéder au caractère concerné, il faut utiliser la notation *caractere, comme pour dé-référencer un pointeur.

    Cela met l'accumulateur à zéro.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    if(std::isalpha(*caractere,loc))
    {
    	accumulator << *caractere;
    	if(caractere+1 != iChaine.end() && std::isalpha(*(caractere+1),loc))
    		accumulator << *(++caractere);
     
    	lettres.push_back(accumulator.str());
    }
    La partie intéressante du code.
    La première condition teste si le caractère est une lettre. Si oui, alors on l'ajoute dans la chaîne à enregisteer (accumulator).

    La deuxième condition fait deux choses, dans l'ordre:
    - (caractere+1 != iChaine.end()) vérifie que le caractère suivant n'est pas le dernier de la chaîne
    - Si oui, std::isalpha(*(caractere+1),loc) vérifie si ce caractère est aussi une lettre.

    Si ce caractère est aussi une lettre, (++caractere) fait avancer l'itérateur d'un cran. Celà revient à faire un ++i; dans une boucle classique. Puis on l'ajoute à l'accumulateur.

    Enfin, on stocke le résultat dans le vecteur, ça tu sais faire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    if(std::isdigit(*caractere,loc))
    {
    	accumulator << *caractere;
    	if(caractere+1 != iChaine.end() && std::isdigit(*(caractere+1),loc))
    		accumulator << *(++caractere);
     
    	double valeur;
    	std::istringstream convertisseur(accumulator.str());
    	convertisseur >> valeur;
     
    	nombres.push_back(valeur);
    }
    Ici c'est pareil, à ceci près qu'on converti le nombre d'abord.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    int main(int argc, char * argv[])
    {
    	std::string input = "AA1G2KL66M8PP96";
    	std::vector<std::string> lettres;
    	std::vector<double> nombres;
    	parserChaine(input,lettres,nombres);
     
    	std::cout << "Lettres: ";
    	for(std::vector<std::string>::iterator it = lettres.begin(); it != lettres.end(); it++) std::cout << *it << "/";
    	std::cout << std::endl;
     
    	std::cout << "Nombres: ";
    	for(std::vector<double>::iterator it = nombres.begin(); it != nombres.end(); it++) std::cout << *it << "/";
    	std::cout << std::endl;
     
        return 0;
    }
    Ceci est juste un code pour tester la fonction et montrer comment s'en servir. Note l'utilisation des itérateurs pour parcourir les objets vector.

  3. #23
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Par défaut
    ouahou !!!!

    quel travail!!!

    merci pour tout ces complements, je vais regarder cela de plus près (ca va m'occuper un moment )

  4. #24
    Membre Expert

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Par défaut
    En passant...
    Citation Envoyé par jblecanard Voir le message
    bool succes = ( qi::parse(iter,end,
    *(
    (alpha [ref(tmp1) = _1] >>-alpha [ref(tmp1) += _1])[push_back(ref(lettres),ref(tmp1))]
    | (digit [ref(tmp2) = _1] >>-digit[ref(tmp2) += _1])[push_back(ref(nombres),ref(tmp2))]
    )) && iter==end );
    Wanna see something cool ?
    Une directive "as" a été rajouté il y a quelques jours dans spirit trunk :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    #include <boost/spirit/include/qi_as.hpp>
    //...
    using qi::as;
    //...
    std::string input("A9RO1E66R7");
    std::vector<std::string> lettres;
    std::vector<double> nombres;
     
    std::string::const_iterator iter = input.begin(); std::string::const_iterator end = input.end();
     
    bool succes = ( qi::parse(iter,end,
    *( 
        (as<std::string>() [alpha >> -alpha] ) [push_back(ref(lettres), _1)] 
      | (as<double>()      [digit >> -digit] ) [push_back(ref(nombres), _1)] 
    )) && iter==end );

  5. #25
    Membre Expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Par défaut
    Génial

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Soucis Format String/Int pour requête LIKE
    Par bonuxis dans le forum Requêtes
    Réponses: 3
    Dernier message: 20/10/2009, 15h20
  2. Réponses: 7
    Dernier message: 26/06/2007, 10h36
  3. [MySQL] regrouper les données sous un format différent
    Par Erakis dans le forum Langage SQL
    Réponses: 5
    Dernier message: 17/01/2006, 15h11
  4. Exporter sous un format jpeg
    Par Kuollu dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 02/05/2005, 10h29
  5. Réponses: 11
    Dernier message: 08/10/2004, 15h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo