Diviser la chaîne par espace en C++
-
Utilisez les fonctions
std::string::find
etstd::string::substr
pour diviser la chaîne par espace en C++ -
Utilisez
std::istringstream
etstd::copy
pour diviser la chaîne par espace en C++ -
Utilisez les idiomes
std::getline
eteffacer-supprimer
pour 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
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 FacebookArticle connexe - C++ String
- Comparaison de chaîne et de caractère en C++
- Supprimer le dernier caractère d'une chaîne en C++
- Obtenir le dernier caractère d'une chaîne en C++
- Différences entre l'opérateur sizeof et la fonction strlen pour les chaînes en C++
- Effacer la chaîne en C++
- Imprimer toutes les permutations de la chaîne en C++