Séparateur dans un string

Signaler
Messages postés
12
Date d'inscription
jeudi 22 avril 2010
Statut
Membre
Dernière intervention
23 juin 2010
-
Messages postés
3819
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
28 septembre 2020
-
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.

1 réponse

Messages postés
3819
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
28 septembre 2020
113
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]