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

Boost C++ Discussion :

Boost::Spirit : espaces dans une chaîne de caractères


Sujet :

Boost C++

  1. #1
    Futur Membre du Club
    Inscrit en
    Mai 2010
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 6
    Points : 6
    Points
    6
    Par défaut Boost::Spirit : espaces dans une chaîne de caractères
    Bonjour,

    Je me penche actuellement sur la bibliothèque Boost::Spirit. J'avance doucement mais je bute sur un problème : j'ai une chaine de caractères pouvant contenir le texte suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::string s = "{Clavier,Azerty, Qwerty}";
    Mon objectif est de récupérer chaque valeur est de les placer dans un std::vector. Avec le texte ci-dessus, pas de souci. Par contre, si le texte est le suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::string s = "{'Clavier FR',Azerty, Qwerty}";
    ... je récupère bien les valeurs mais je perds l'espace de la valeur 'Clavier FR'

    Comment faire ?


    Voici le bout de code sur lequel je travaille :

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
    #include <iostream>
    #include <string>
    #include <boost/spirit/include/qi.hpp>
    #include <boost/spirit/include/phoenix.hpp>
     
    #define BOOST_SPIRIT_USE_PHOENIX_V3
     
    using namespace boost::spirit;
     
    template <typename Iterator, typename Skipper>
    struct pg_string_array_grammar : qi::grammar<Iterator, std::vector<std::string>(), Skipper>
    {
        pg_string_array_grammar() : pg_string_array_grammar::base_type{strings_}
        {
            string_        = *ascii::alnum;
            quoted_string_ = "'" >> string_ >> "'";
            strings_       = "{" >> ((quoted_string_ | string_ ) % ",") >> "}";
        }
     
        qi::rule<Iterator, std::string(), Skipper>              string_;
        qi::rule<Iterator, std::string(), Skipper>              quoted_string_;
        qi::rule<Iterator, std::vector<std::string>(), Skipper> strings_;
    };
     
    int main()
    {
        //std::string s1{"{'azerty',toto,titi tata,'qwerty','clavier','clavier us'}"};
        std::string s1{"{'azerty', 'clavier fr'}"};
        //std::string s1{"{'azerty', 'clavier'}"};
        std::vector<std::string> v1;
     
        pg_string_array_grammar<std::string::iterator, qi::space_type> g1;
     
        if (qi::phrase_parse(s1.begin(), s1.end(), g1, qi::space_type(), v1))
        {
            for (const auto &elem : v1)
                std::cout << elem << std::endl;
        }
    }
    Merci d'avance,

    Jean-Michel

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 116
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 116
    Points : 32 969
    Points
    32 969
    Billets dans le blog
    4
    Par défaut
    Salut,

    es-tu obligé d'utiliser Boost::Spirit pour ça ?
    Sinon, il suffirait d'enlever les espaces initiaux et finaux uniquement, et juste avec std::string c'est aisément faisable.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonsoir,

    Quittes à expérimenter Boost Spirit, regarde plutôt la dernière version X3.

    En ce qui concerne les espaces qui sont mangés par le skipper, tu peux l'inhiber localement à l'aide de la directive lexeme[].

  4. #4
    Futur Membre du Club
    Inscrit en
    Mai 2010
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 6
    Points : 6
    Points
    6
    Par défaut
    Bonjour,

    @Bousk : effectivement, j'ai déjà une solution fonctionnelle basée sur boost::regex. Néanmoins, j'essaie d'utiliser Boost::Spirit et je souhaiterais arriver à faire la même chose sur ce type de problème

    @Winjerome : OK pour les conseils. Je vais essayer avec Spirit X3.

    Jean-Michel

Discussions similaires

  1. Espace dans une chaîne de caractères
    Par Dan25 dans le forum VBScript
    Réponses: 2
    Dernier message: 25/02/2011, 19h30
  2. [WebI XiR2] Suppression d'un espace dans une chaîne de caractères
    Par SGA99 dans le forum Débuter
    Réponses: 6
    Dernier message: 02/12/2010, 17h12
  3. Supprimer les espaces dans une chaîne de caractère
    Par Med_be dans le forum Débuter
    Réponses: 7
    Dernier message: 15/11/2010, 03h17
  4. Réponses: 16
    Dernier message: 19/11/2008, 12h02
  5. Effacer les espaces dans une chaîne de caractères
    Par JohnnyWalk dans le forum Débuter avec Java
    Réponses: 16
    Dernier message: 19/07/2007, 14h13

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