HOWTO · C++
So teilen Sie eine durch Kommas getrennte Zeichenfolge in C++ auf
Teilen Sie eine einfache durch Kommas getrennte Zeichenfolge in C++ mit std::stringstream und std::getline oder mit std::string::find und std::string::substr auf.
Auf dieser Seite
Für eine einfache durch Kommas getrennte Zeichenfolge ist std::stringstream mit std::getline eine unkomplizierte Möglichkeit, jeden Wert in einem std::vector<std::string> zu sammeln. Wenn Sie steuern müssen, wie jedes Teilstück extrahiert wird, bieten std::string::find und std::string::substr eine manuelle Alternative. Diese Ansätze teilen an einem Trennzeichen; sie analysieren keine vollständige CSV-Syntax, etwa Kommas innerhalb von in Anführungszeichen gesetzten Feldern.
Eine durch Kommas getrennte Zeichenfolge mit std::stringstream und std::getline aufteilen
Fügen Sie <sstream> ein, um einen Stream aus der Eingabezeichenfolge zu konstruieren, und <vector>, um die Teilstücke zu speichern. Übergeben Sie das Komma als drittes Argument an std::getline; jeder Aufruf liest bis zu diesem Trennzeichen und legt den extrahierten Text in item ab. Die Schleife fügt jedes Element zum Vektor hinzu und gibt dann die gesammelten Werte aus.
Verwenden Sie std::vector<std::string>, wenn späterer Code die Token indizieren oder erneut über sie iterieren muss; er speichert jeden extrahierten Wert als separate Zeichenfolge in der Reihenfolge der Eingabe.
#include <iostream>
#include <sstream>
#include <string>
#include <vector>
int main() {
const std::string input = "apple,banana,cherry,dates";
std::stringstream stream(input);
std::vector<std::string> items;
std::string item;
while (std::getline(stream, item, ',')) {
items.push_back(item);
}
for (const std::string& value : items) {
std::cout << value << '\n';
}
}
apple
banana
cherry
dates
Dieses Beispiel verwendet ein Komma als Trennzeichen und speichert die vier extrahierten Zeichenfolgen in Reihenfolge. std::getline mit einem Trennzeichen kann zwischen aufeinanderfolgenden Kommas ein leeres Element erzeugen, während ein Trennzeichen ganz am Ende in dieser Schleife kein abschließendes Element erzeugt. Wenn Ihre Eingabe für solche Fälle eine andere Behandlung benötigt, entscheiden Sie, was jede Trennzeichenposition bedeuten soll, und berücksichtigen Sie dies in der Analyselogik. Die extrahierten Zeichenfolgen behalten alle Leerzeichen bei, die Teil der Eingabe sind. Kürzen Sie daher jedes Element separat, wenn umgebender Leerraum verworfen werden soll. Ändern Sie das Trennzeichenargument, wenn die Quelle ein anderes einzelnes Zeichen verwendet, etwa ein Semikolon.
Eine durch Kommas getrennte Zeichenfolge mit std::string::find und std::string::substr aufteilen
Das Element std::string::find findet das nächste Komma, und std::string::substr kopiert die Zeichen davor. Behalten Sie einen Startindex in die ursprüngliche Eingabe bei, anstatt Zeichen während des Vorgangs zu löschen. Wenn find den Wert std::string::npos zurückgibt, gibt es keine weiteren Kommas. Nehmen Sie daher das verbleibende Suffix als letztes Element und beenden Sie den Vorgang.
#include <iostream>
#include <string>
#include <vector>
int main() {
const std::string input = "apple,banana,cherry,dates";
std::vector<std::string> items;
std::string::size_type start = 0;
while (true) {
const std::string::size_type comma = input.find(',', start);
if (comma == std::string::npos) {
items.push_back(input.substr(start));
break;
}
items.push_back(input.substr(start, comma - start));
start = comma + 1;
}
for (const std::string& value : items) {
std::cout << value << '\n';
}
}
apple
banana
cherry
dates
Der abschließende Aufruf substr(start) ist wichtig: Er fügt den Text nach dem letzten Komma hinzu, einschließlich des letzten Werts, wenn keine Trennzeichen mehr vorhanden sind. Diese Version behandelt eine Eingabe mit einem abschließenden Komma ebenfalls als Eingabe mit einem abschließenden leeren Element, anders als die Stream-Schleife oben. Für eine vollständig leere Eingabe speichert sie ebenso eine leere Zeichenfolge. Passen Sie daher die Schleifenbedingung an, wenn Ihre Anwendung diese Eingabe als keine Werte behandeln soll. Die Suche beginnt beim Zeichen nach jedem Komma, wodurch eine Änderung der Eingabe während der Analyse vermieden wird und die ursprüngliche Zeichenfolge für eine spätere Verwendung leicht erhalten bleibt. Keiner der beiden Ansätze behandelt Kommas in Anführungszeichen oder maskierte Anführungszeichen; verwenden Sie einen CSV-Parser, wenn diese Regeln Teil des Eingabeformats sind.