Entfernen von Satzzeichen aus einer Zeichenkette in C++

Jinku Hu 12 Oktober 2023
  1. Verwenden Sie die Funktionen std::erase und std::remove_if, um Interpunktion aus Zeichenketten in C++ zu entfernen
  2. Verwenden einer benutzerdefinierten Funktion zum Entfernen von Interpunktionszeichen aus einer Zeichenkette in C++
  3. Iterative Methode zum Entfernen von Interpunktionszeichen aus Zeichenketten verwenden in C++
Entfernen von Satzzeichen aus einer Zeichenkette in C++

In diesem Artikel werden verschiedene Methoden zum Entfernen von Interpunktion aus einer Zeichenkette in C++ erläutert.

Verwenden Sie die Funktionen std::erase und std::remove_if, um Interpunktion aus Zeichenketten in C++ zu entfernen

std::remove_if ist Teil der STL-Algorithmusbibliothek und kann alle Elemente entfernen, für die die angegebene Bedingung true ergibt. Die Bedingung sollte den Wert bool für jedes Element im Bereich zurückgeben. In diesem Fall übergeben wir die Funktion ispunct, um nach Interpunktionssymbolen zu suchen. Beachten Sie, dass std::remove_if einen Pass-the-End-Iterator für den neuen Wertebereich zurückgibt. Daher verketten wir den Aufruf mit der Methode erase, die zur analysierten Zeichenkette führt. Diese Lösung funktioniert ähnlich wie die Redewendung Löschen-Entfernen.

#include <iostream>
#include <string>

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

int main() {
  string text =
      "Lorem ipsum, dolor sit! amet, consectetur? adipiscing elit. Ut "
      "porttitor.";

  cout << text << endl;

  text.erase(std::remove_if(text.begin(), text.end(), ispunct), text.end());
  cout << text << endl;

  return EXIT_SUCCESS;
}

Ausgabe:

Lorem ipsum, dolor sit! amet, consectetur? adipiscing elit. Ut porttitor.
Lorem ipsum dolor sit amet consectetur adipiscing elit Ut porttitor

Verwenden einer benutzerdefinierten Funktion zum Entfernen von Interpunktionszeichen aus einer Zeichenkette in C++

Alternativ kann die vorherige Methode in eine separate Funktion verschoben werden, indem eine lokale Kopie der angegebenen Zeichenkette erstellt und bearbeitet wird, während der analysierte Wert an den Aufrufercode zurückgegeben wird. Diese Funktion kann verwendet werden, um die Funktionalität zu erweitern, um verschiedene Zeichengruppen zu unterstützen, oder um sogar die benutzerdefinierte Prädikatfunktion für den dritten Parameter des Algorithmus remove_if zu übergeben.

#include <iostream>
#include <string>

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

string removeSpaces(const string& s) {
  string tmp(s);
  tmp.erase(std::remove_if(tmp.begin(), tmp.end(), ispunct), tmp.end());
  return tmp;
}

int main() {
  string text =
      "Lorem ipsum, dolor sit! amet, consectetur? adipiscing elit. Ut "
      "porttitor.";

  cout << text << endl;

  string parsed_text = removeSpaces(text);
  cout << parsed_text << endl;

  return EXIT_SUCCESS;
}

Ausgabe:

Lorem ipsum, dolor sit! amet, consectetur? adipiscing elit. Ut porttitor.
Lorem ipsum dolor sit amet consectetur adipiscing elit Ut porttitor

Iterative Methode zum Entfernen von Interpunktionszeichen aus Zeichenketten verwenden in C++

Eine andere Alternative besteht darin, eine separate Funktion zu implementieren, die jedes Zeichen der Zeichenkette durchläuft. Die Funktion nimmt die Zeichenkette als Referenz und verwendet die for-Schleife, um die Zeichenkette zu durchlaufen. In jeder Iteration wird ispunct aufgerufen, um zu überprüfen, ob das Zeichen ein Interpunktionssymbol ist oder nicht. Beachten Sie, dass der Variablen len bei jeder Übereinstimmungsbedingung die Größe der Zeichenkette zugewiesen wird, da das ursprüngliche Zeichenkettenobjekt durch die Funktion erase geändert wird und die Schleife die Anzahl erneuern muss.

#include <iostream>
#include <string>

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

void removeSpaces2(string& s) {
  for (int i = 0, len = s.size(); i < len; i++) {
    if (ispunct(s[i])) {
      s.erase(i--, 1);
      len = s.size();
    }
  }
}

int main() {
  string text =
      "Lorem ipsum, dolor sit! amet, consectetur? adipiscing elit. Ut "
      "porttitor.";

  cout << text << endl;

  removeSpaces2(text);
  cout << text << endl;

  return EXIT_SUCCESS;
}

Ausgabe:

Lorem ipsum, dolor sit! amet, consectetur? adipiscing elit. Ut porttitor.
Lorem ipsum dolor sit amet consectetur adipiscing elit Ut porttitor
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