Chaîne divisée en C++

Jinku Hu 12 octobre 2023
  1. Utilisez les fonctions std::string::find et std::string::erase pour diviser la chaîne en C++
  2. Utilisez les idiomes std::getline et effacer-supprimer pour diviser la chaîne en C++
  3. Utilisez std::istringstream avec std::copy et std::istream_iterator pour diviser la chaîne en C++
Chaîne divisée en C++

Cet article explique plusieurs méthodes de fractionnement d’une chaîne en C++.

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

Les fonctions find et erase sont des membres intégrés de la classe std::string, et elles peuvent être combinées pour diviser le texte en jetons délimités par les caractères donnés. Cette méthode peut être utilisée pour diviser une chaîne par n’importe quelle sous-chaîne déclarée par l’utilisateur ou par un seul caractère. Pourtant, l’exemple de code suivant illustre le scénario lorsque le délimiteur est a. La méthode find renvoie une position de la sous-chaîne si elle est trouvée ou string::npos si elle n’est pas trouvée. Notez que nous devons supprimer la partie traitée de la chaîne plus le délimiteur. Ainsi, la fonction erase est appelée pour gérer cette tâche.

#include <iostream>
#include <string>
#include <vector>

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

int main() {
  string text =
      "Vivamus quis sagittis diam. "
      "Cras accumsan, dui id varius "
      "vitae tortor.";
  string delimiter = "a";
  vector<string> words{};

  size_t pos;
  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:

Viv
mus quis s
gittis di
m. Cr
s
ccums
n, dui id v
rius vit

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

Une méthode similaire pour résoudre le problème donné est d’utiliser la fonction std::getline, qui peut également extraire des sous-chaînes entre le délimiteur spécifié par l’utilisateur. L’exemple de code suivant divise le texte sur chaque caractère d’espace et stocke les chaînes extraites dans un conteneur std::vector. Notez cependant qu’il existe un idiome effacer-supprimer utilisé pour supprimer tous les caractères de ponctuation des chaînes avant qu’ils ne soient stockés.

#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::vector;

int main() {
  string text =
      "Vivamus quis sagittis diam. "
      "Cras accumsan, dui id varius "
      "vitae tortor.";

  vector<string> words{};
  char delimiter = ' ';

  istringstream sstream(text);
  string word;
  while (std::getline(sstream, word, delimiter)) {
    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:

Vivamus
quis
sagittis
diam
Cras
accumsan
dui
id
varius
vitae
tortor

Utilisez std::istringstream avec std::copy et std::istream_iterator pour diviser la chaîne en C++

Alternativement, on pourrait initialiser l’objet std::istringstream avec le texte à scinder et le parcourir avec std::istream_iterator. Notez que cette méthode ne peut fractionner les chaînes que par des espaces qui est le délimiteur par défaut pour le istream_iterator. Enfin, nous devons copier les chaînes extraites dans le conteneur vector, ce qui se fait à l’aide de l’algorithme std::copy.

#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::vector;

int main() {
  string text =
      "Vivamus quis sagittis diam. "
      "Cras accumsan, dui id varius "
      "vitae tortor.";

  vector<string> words{};
  char delimiter = ' ';

  istringstream iss(text);
  copy(std::istream_iterator<string>(iss), std::istream_iterator<string>(),
       std::back_inserter(words));

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

  return EXIT_SUCCESS;
}

Production:

Vivamus
quis
sagittis
diam.
Cras
accumsan,
dui
id
varius
vitae
tortor.
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