Séparateur dans un string

fadoch Messages postés 12 Date d'inscription jeudi 22 avril 2010 Statut Membre Dernière intervention 23 juin 2010 - 23 juin 2010 à 11:37
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 - 23 juin 2010 à 12:12
Bonjour à tous,
je cherche à découper une chaîne en fonction d'un séparateur, jusqu'à là ça va.
mon problème c'est que mon séparateur peut être un espace ou une tabulation.
je sais qu'en PERL il existe "\s" qui englobe tout ce qui est espace vide de caractères. existe t-il un équivalent en C++?
merci beaucoup.
A voir également:

1 réponse

cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
23 juin 2010 à 12:12
Tu peux utiliser getline dans un stringstream. getline à un troisième argument pour spécifier le type de délimiteur (par défaut c'est \n). Mais on ne peut pas prendre plusieurs délimiteurs.
http://www.cplusplus.com/reference/string/getline/

La solution consiste à utiliser boost pour le faire. Il y a une méthode "split" qui permet de faire cela.
On lui donne les délimiteurs, et il se débrouille pour couper la chaîne. \s => " \n\t\v\r\f"

A noter que cet exemple n'est pas optimisé, car on créer un nouveau std::string pour chaque élément.
Si on veut juste avoir des références sur les éléments, il faut utiliser un: std::list> à la place d'un std::vector<std::string>.

#include 
#include <vector>
#include 
#include 

int main()
{
  const std::string line = "Une ligne    separee par des"
    "   espaces et es \n saut de lignes\n\n mutliples, ainsi que"
    "  \t\t  des \ttabulations";

  std::cout << line << std::endl; 

  std::vector<std::string> tab;
  boost::split(tab, line, boost::algorithm::is_any_of(" \n\t\v\r\f"),
       boost::token_compress_on);

  for (std::vector<std::string>::const_iterator it = tab.begin();
       it != tab.end(); ++it)
    std::cout << "<" << *it << ">" << std::endl;

  return 0;
}


_____________________________________________
Historique de mes créations, et quelques articles:[ http://0217021.free.fr/portfolio
http://0217021.free.fr/portfolio]
0
Rejoignez-nous