HOWTO · C++

Analyser une séquence de chaînes séparées par des virgules en C++

Cet article explique comment analyser une séquence de chaînes séparées par des virgules en C++

Sur cette page

Cet article présente plusieurs méthodes sur la façon d’analyser une séquence de chaînes séparées par des virgules en C++.

Utilisez les fonctions std::string::find et std::string::erase pour analyser une séquence de chaînes séparées par des virgules en C++

La méthode std::find est une fonction intégrée de la classe std::string, et elle peut être utilisée pour trouver la position de la sous-chaîne donnée. Il prend un seul argument dans ce cas qui désigne la sous-chaîne à trouver. Toute variable de chaîne à plusieurs caractères peut être initialisée pour être transmise en tant qu’argument. Bien que, dans l’exemple suivant, nous déclarions une seule virgule contenant string. Puisque la méthode find renvoie la position de la sous-chaîne et string::npos lorsque la sous-chaîne n’est pas trouvée, nous pouvons mettre l’expression de comparaison dans une boucle while qui va s’exécuter jusqu’à ce que l’expression évalue true.

Nous stockons également la chaîne analysée à chaque itération dans le conteneur vector. Ensuite, la méthode erase est appelée pour supprimer les caractères avant et y compris le premier séparateur virgule trouvé afin de continuer à traiter le même objet string dans l’itération suivante. Enfin, nous sortons les éléments stockés dans le vector dans le flux cout.

#include <algorithm>
#include <iostream>
#include <sstream>
#include <string>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::stringstream;
using std::vector;

int main() {
  string text = "1,2,3,4,5,6,7,8,9,10";
  string delimiter = ",";
  vector<string> words{};

  size_t pos = 0;
  while ((pos = text.find(delimiter)) != string::npos) {
    words.push_back(text.substr(0, pos));
    text.erase(0, pos + delimiter.length());
  }
  for (const auto &str : words) {
    cout << str << endl;
  }

  return EXIT_SUCCESS;
}

Production:

1
2
3
4
5
6
7
8
9

Utilisez la fonction std::getline pour analyser la séquence de chaînes séparées par des virgules

La solution précédente manque l’extraction du dernier nombre dans la séquence séparée par des virgules. Il peut donc être préférable d’utiliser la méthode suivante en utilisant la fonction std::getline plutôt que d’ajouter une vérification conditionnelle dans l’exemple de code précédent. getline lit les caractères du flux d’entrée donné et les stocke dans un objet string. La fonction prend également un troisième argument facultatif pour spécifier le délimiteur par lequel diviser la chaîne d’entrée. Nous stockons également les chaînes extraites dans le conteneur std::vector à chaque itération pour une utilisation ultérieure.

#include <algorithm>
#include <iostream>
#include <sstream>
#include <string>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::stringstream;
using std::vector;

int main() {
  string text = "1,2,3,4,5,6,7,8,9,10";
  char delimiter = ',';
  vector<string> words{};

  stringstream sstream(text);
  string word;
  while (std::getline(sstream, word, delimiter)) {
    words.push_back(word);
  }

  for (const auto &str : words) {
    cout << str << endl;
  }

  return EXIT_SUCCESS;
}

Production:

1
2
3
4
5
6
7
8
9
10