String nach Leerzeichen aufteilen in C++

Jinku Hu 12 Oktober 2023
  1. Verwenden der Funktionen std::string::find und std::string::substr zum Aufteilen von Strings nach Leerzeichen in C++
  2. Verwendung von std::istringstream und std::copy zum Aufteilen von Zeichenketten nach Leerzeichen in C++
  3. Verwenden Sie das Idiom std::getline und erase-remove, um Zeichenketten in C++ nach Leerzeichen zu trennen
String nach Leerzeichen aufteilen in C++

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
Autor: 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

Verwandter Artikel - C++ String