Comment découper une chaîne (string) en C++ ?

Une fonction permet d'extraire une chaîne de caractères d'une autre chaîne en fonction d'un délimiteur et de stocker les chaînes au fur et à mesure dans un vecteur.

Contrairement à d'autres langages comme le PHP, le langage C++++ ne fournit pas de méthode pour séparer une chaîne de caractères en fonction d'un délimiteur. Il faut pour cela écrire soi-même la fonction.

La méthode la plus simple consiste à utiliser la fonction getline() qui permet d'extraire une chaîne de caractères d'une autre chaîne en fonction d'un délimiteur et de stocker les chaînes au fur et à mesure dans un vecteur. Il faut pour cela passer le vecteur et la chaîne à découper en référence à la fonction.

#include 
#include 
#include 
using namespace std;
void split(const string &chaine, char delimiteur, vector &elements)
{
 stringstream ss(chaine);
 string sousChaine;
 while (getline(ss, sousChaine, delimiteur))
 {
 elements.push_back(sousChaine);
 }
}

Pour que le comportement de la fonction split() soit similaire aux fonctions utilisées par d'autres langages, on peut ajouter une autre fonction split() qui crée le vecteur, appelle la première fonction puis retourne le vecteur contenant les chaînes séparées.

vector split(const string &chaine, char delimiteur) 
{
 vector elements;
 split(chaine, delimiteur, elements);
 return elements;
}

L'appel de la fonction dans le code s'effectue de la façon suivante :

vector<string> x = split(un deux trois, ' ');

Si vous souhaitez séparer une chaîne de caractères avec comme délimiteur l'espace, vous pouvez utiliser l'itérateur istream_iterator. Il va automatiquement découper une chaîne en plusieurs chaînes de caractères selon les espaces. La fonction copy() est ensuite utilisée pour afficher le texte sur le flux de sortie.

int main()
{
 using namespace std;
 string phrase = Ma phrase à découper;
 istringstream iss(phrase);
 copy(istream_iterator(iss),
 istream_iterator(),
 ostream_iterator(cout, \n));
}

Si vous souhaitez récupérer le résultat de la séparation, vous pouvez utiliser un vecteur de chaînes de caractères et modifier la fonction copy().

int main()
{
 using namespace std;
 vector elements;
 string phrase = Ma phrase à découper;
 istringstream iss(phrase);
 copy(istream_iterator(iss),
 istream_iterator(),
 back_inserter(elements));
}