106 votes

Fractionnement d'une C++ std::string en utilisant des jetons, par exemple ";"

Possible Duplicate:
Comment diviser une chaîne en C++ ?

Meilleure façon de diviser une chaîne en C++ ? On peut supposer que la chaîne est composée de mots séparés par ;

De notre point de vue des directives, les fonctions de chaînes C ne sont pas autorisées et Boost n'est pas autorisé à utiliser en raison de préoccupations de sécurité open source n'est pas autorisée.

La meilleure solution que j'ai actuellement est :

string str("danemark;suede;inde;us");

La chaîne ci-dessus doit être stockée dans un vecteur en tant que chaînes. Comment pouvons-nous y parvenir ?

Merci pour vos contributions.

250voto

Martin Stone Points 5779

Je trouve std::getline() souvent le plus simple. Le paramètre de délimiteur facultatif signifie qu'il ne s'agit pas seulement de lire des " lignes ":

#include <sstream>
#include <iostream>
#include <vector>

using namespace std;

int main() {
    vector strings;
    istringstream f("denmark;sweden;india;us");
    string s;    
    while (getline(f, s, ';')) {
        cout << s << endl;
        strings.push_back(s);
    }
}

21voto

Fox32 Points 5527

Vous pourriez utiliser un flux de chaînes et lire les éléments dans le vecteur.

Ici sont de nombreux exemples différents...

Une copie de l'un des exemples :

std::vector split(const std::string& s, char separateur)
{
   std::vector output;

    std::string::size_type prev_pos = 0, pos = 0;

    while((pos = s.find(separateur, pos)) != std::string::npos)
    {
        std::string sous_chaine( s.substr(prev_pos, pos-prev_pos) );

        output.push_back(sous_chaine);

        prev_pos = ++pos;
    }

    output.push_back(s.substr(prev_pos, pos-prev_pos)); // Dernier mot

    return output;
}

11voto

hkaiser Points 8097

Il existe plusieurs bibliothèques disponibles pour résoudre ce problème, mais la plus simple est probablement d'utiliser Boost Tokenizer:

#include <iostream>
#include <string>
#include <boost/tokenizer.hpp>
#include <boost/foreach.hpp>

typedef boost::tokenizer > tokenizer;

std::string str("denmark;sweden;india;us");
boost::char_separator sep(";");
tokenizer tokens(str, sep);

BOOST_FOREACH(std::string const& token, tokens)
{
    std::cout << "<" << *tok_iter << "> " << "\n";
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X