String nach Leerzeichen aufteilen in C++
-
Verwenden der Funktionen
std::string::find
undstd::string::substr
zum Aufteilen von Strings nach Leerzeichen in C++ -
Verwendung von
std::istringstream
undstd::copy
zum Aufteilen von Zeichenketten nach Leerzeichen in C++ -
Verwenden Sie das Idiom
std::getline
underase-remove
, um Zeichenketten in C++ nach Leerzeichen zu trennen
In diesem Artikel werden verschiedene Methoden zum Teilen von Zeichenketten nach Leerzeichen in C++ beschrieben.
Verwenden der Funktionen std::string::find
und std::string::substr
zum Aufteilen von Strings nach Leerzeichen in C++
find
und substr
sind integrierte Funktionen von std::string
, mit denen Zeichenketten durch ein beliebiges Trennzeichen geteilt werden können, das durch den Zeichenkettenwert oder ein einzelnes Zeichen angegeben wird. Die Funktion find
verwendet ein Argument string
und gibt die Position zurück, an der der angegebene Teilstring beginnt. Andernfalls wird string::npos
zurückgegeben, wenn es nicht gefunden wird. Daher iterieren wir in der while
-Schleife, bis die find
-Funktion npos
zurückgibt. In der Zwischenzeit kann die Methode substr
verwendet werden, um auf den Teil der Zeichenkette vor dem Trennzeichen zuzugreifen, der in diesem Fall ein einzelnes Leerzeichen ist, und zur späteren Verwendung in einem Vektor
gespeichert zu werden. Danach rufen wir die Funktion erase
auf, um die erste Sequenz einschließlich des Trennzeichens zu entfernen. An diesem Punkt kann eine neue Iteration fortfahren, um die Operationen zu wiederholen.
#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;
}
Ausgabe:
Lorem
ipsum
dolor
sit
amet,
consectetur
adipiscing
elit.
Sed
laoreet
sem
leo,
in
posuere
orci
Verwendung von std::istringstream
und std::copy
zum Aufteilen von Zeichenketten nach Leerzeichen in C++
Alternativ können wir den Code mithilfe der Klasse istringstream
erneut implementieren, die Eingabe- / Ausgabeoperationen für Streams auf der Basis von Zeichenketten
bereitstellt. Sobald wir das Objekt istringstream
mit dem zu teilenden Wert string
initialisiert haben, kann der Algorithmus std::copy
aufgerufen werden, um jeden durch Leerzeichen getrennten Zeichenkettenwert in den Stream cout
auszugeben. Beachten Sie, dass diese Methode nur die Aufteilung des Leerzeichenbegrenzers unterstützt, da dies die Implementierung der Klasse istringstream
bietet.
#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;
}
Verwenden Sie das Idiom std::getline
und erase-remove
, um Zeichenketten in C++ nach Leerzeichen zu trennen
Ein Nachteil der vorherigen Lösung sind die Interpunktionssymbole, die mit analysierten Wörtern gespeichert sind. Es kann mit der Lösch-Entfernungs-Sprache gelöst werden, die im Wesentlichen eine bedingte Entfernungsoperation für den gegebenen Bereich ist. In diesem Fall rufen wir diese Methode für jedes von std::getline
abgerufene Wort auf, um alle darin enthaltenen Interpunktionssymbole zu kürzen. Beachten Sie, dass das Funktionsobjekt ispunct
als drittes Argument an den Algorithmus remove_if
übergeben wird, um nach Interpunktionszeichen zu suchen.
#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;
}
Ausgabe:
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 FacebookVerwandter Artikel - C++ String
- Finden Sie das erste sich wiederholende Zeichen in einer Zeichenfolge in C++
- Finden Sie die längste gemeinsame Teilzeichenfolge in C++
- Großschreiben des ersten Buchstabens einer Zeichenfolge in C++
- Vergleich von String und Character in C++
- Entfernen Sie das letzte Zeichen aus einer Zeichenkette in C++
- Abrufen des letzten Zeichens einer Zeichenkette in C++