Duplicata possible:
Comment diviser une chaîne?Quelle est la bonne façon de diviser une chaîne en un vecteur de chaînes. Le délimiteur est un espace ou une virgule.
Réponses
Trop de publicités?Un moyen pratique serait la bibliothèque d'algorithmes de chaîne de boost .
std::vector<std::string> words;
std::string s;
boost::split(words, s, boost::is_any_of(", "), boost::token_compress_on);
Pour les chaînes séparées par des espaces, vous pouvez alors faire ceci:
std::string s = "What is the right way to split a string into a vector of strings";
std::stringstream ss(s);
std::istream_iterator<std::string> begin(ss);
std::istream_iterator<std::string> end;
std::vector<std::string> vstrings(begin, end);
std::copy(vstrings.begin(), vstrings.end(), std::ostream_iterator<std::string>(std::cout, "\n"));
Production:
What
is
the
right
way
to
split
a
string
into
a
vector
of
strings
Démo en ligne: http://ideone.com/d8E2G
chaîne ayant à la fois une virgule et un espace
struct tokens: std::ctype<char>
{
tokens(): std::ctype<char>(get_table()) {}
static std::ctype_base::mask const* get_table()
{
typedef std::ctype<char> cctype;
static const cctype::mask *const_rc= cctype::classic_table();
static cctype::mask rc[cctype::table_size];
std::memcpy(rc, const_rc, cctype::table_size * sizeof(cctype::mask));
rc[','] = std::ctype_base::space;
rc[' '] = std::ctype_base::space;
return &rc[0];
}
};
std::string s = "right way, wrong way, correct way";
std::stringstream ss(s);
ss.imbue(std::locale(std::locale(), new tokens()));
std::istream_iterator<std::string> begin(ss);
std::istream_iterator<std::string> end;
std::vector<std::string> vstrings(begin, end);
std::copy(vstrings.begin(), vstrings.end(), std::ostream_iterator<std::string>(std::cout, "\n"));
Production:
right
way
wrong
way
correct
way
Démo en ligne: http://ideone.com/aKL0m
Si la chaîne contient à la fois des espaces et des virgules, vous pouvez utiliser la fonction de classe de chaîne
found_index = myString.find_first_of(delims_str, begin_index)
en boucle. Recherche de! = Npos et insertion dans un vecteur. Si vous préférez la vieille école, vous pouvez également utiliser des C
strtok()
méthode.