Diviser la chaîne par espace en C++

Jinku Hu 12 octobre 2023
  1. Utilisez les fonctions std::string::find et std::string::substr pour diviser la chaîne par espace en C++
  2. Utilisez std::istringstream et std::copy pour diviser la chaîne par espace en C++
  3. Utilisez les idiomes std::getline et effacer-supprimer pour diviser la chaîne par espace en C++
Diviser la chaîne par espace en C++

Cet article présente plusieurs méthodes expliquant comment fractionner une chaîne par un séparateur d’espace en C++.

Utilisez les fonctions std::string::find et std::string::substr pour diviser la chaîne par espace en C++

find et substr sont des fonctions intégrées std::string qui peuvent être utilisées pour diviser une chaîne par n’importe quel délimiteur spécifié par la valeur de la chaîne ou un seul caractère. La fonction find prend un argument string et retourne la position sur laquelle commence la sous-chaîne donnée; sinon, s’il n’est pas trouvé, string::npos est renvoyé. Ainsi, nous itérons dans la boucle while jusqu’à ce que la fonction find renvoie npos. Pendant ce temps, la méthode substr peut être utilisée pour accéder à la partie de la chaîne avant le délimiteur, qui dans ce cas est un caractère d’espace unique et stockée dans un vector pour une utilisation ultérieure. Après cela, nous appelons la fonction erase pour supprimer la première séquence, y compris le délimiteur, à quel point une nouvelle itération peut procéder pour répéter les opérations.

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

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

int main() {
  string text =
      "Lorem ipsum dolor sit amet, consectetur adipiscing elit. "
      "Sed laoreet sem leo, in posuere orci elementum.";
  string space_delimiter = " ";
  vector<string> words{};

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

  return EXIT_SUCCESS;
}

Production:

Lorem
ipsum
dolor
sit
amet,
consectetur
adipiscing
elit.
Sed
laoreet
sem
leo,
in
posuere
orci

Utilisez std::istringstream et std::copy pour diviser la chaîne par espace en C++

Alternativement, nous pouvons réimplémenter le code en utilisant la classe istringstream, qui fournit des opérations d’entrée/sortie pour les flux basés sur string. Une fois que nous initialisons l’objet istringstream avec la valeur string qui doit être fractionnée, alors l’algorithme std::copy peut être appelé pour sortir chaque valeur de chaîne séparée par des espaces dans le flux cout. Notez que cette méthode ne supporte que le fractionnement du délimiteur d’espace car c’est ce que fournit l’implémentation de la classe istringstream.

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

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

int main() {
  string text =
      "Lorem ipsum dolor sit amet, consectetur adipiscing elit. "
      "Sed laoreet sem leo, in posuere orci elementum.";
  vector<string> words{};

  istringstream iss(text);
  copy(std::istream_iterator<string>(iss), std::istream_iterator<string>(),
       std::ostream_iterator<string>(cout, "\n"));

  return EXIT_SUCCESS;
}

Utilisez les idiomes std::getline et effacer-supprimer pour diviser la chaîne par espace en C++

Un inconvénient de la solution précédente est les symboles de ponctuation stockés avec les mots analysés. Il peut être résolu avec l’idiome effacer-supprimer, qui est essentiellement une opération de suppression conditionnelle pour la plage donnée. Dans ce cas, nous appelons cette méthode sur chaque mot récupéré par std::getline pour couper tous les symboles de ponctuation qu’il contient. Notez que l’objet fonction ispunct est passé comme troisième argument à l’algorithme remove_if pour vérifier les caractères de ponctuation.

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

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

int main() {
  string text =
      "Lorem ipsum dolor sit amet, consectetur adipiscing elit. "
      "Sed laoreet sem leo, in posuere orci elementum.";
  char space_char = ' ';
  vector<string> words{};

  stringstream sstream(text);
  string word;
  while (std::getline(sstream, word, space_char)) {
    word.erase(std::remove_if(word.begin(), word.end(), ispunct), word.end());
    words.push_back(word);
  }

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

  return EXIT_SUCCESS;
}

Production:

Lorem
ipsum
dolor
sit
amet
consectetur
adipiscing
elit
Sed
laoreet
sem
leo
in
posuere
orci
elementum
Auteur: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

Article connexe - C++ String