Wie man std::string in C++ trimmt: 5 Arbeitsweisen für Anfänger und Profis

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Einleitung: Warum das Trimmen von Strings für jeden C++-Entwickler eine Qual ist

\n\n

Wenn Sie jemals einen Log-Parser in C++ geschrieben, Benutzereingaben gelesen oder CSV-Dateien verarbeitet haben, sind Sie sicherlich auf das Problem gestoßen: Strings kommen mit „überflüssigen" Leerzeichen, Tabulatoren oder Zeilenumbrüchen daher. In Python gibt es das eingebaute strip(), in Java trim(), aber in C++ stellt die Standardbibliothek keine fertige Funktion zum Trimmen von Strings bereit. Dies ist eine der häufigsten Fragen auf Stack Overflow (über 350.000 Aufrufe), und heute werden wir ein für alle Mal klären, wie man diese Aufgabe elegant löst.

\n\n

In diesem Artikel erfahren Sie:

\n
    \n
  • Warum C++ kein eingebautes trim hat und wie man das umgeht
  • \n
  • 5 bewährte Methoden zum Trimmen von std::string
  • \n
  • Wie Sie Ihre eigene universelle Trim-Funktion schreiben
  • \n
  • Wann Sie Boost und wann reines C++11/17 verwenden sollten
  • \n
\n\n

Was ist Trimmen und wozu braucht man es?

\n\n

Trimmen (String-Trimmung) ist das Entfernen von Leerzeichen (Leerzeichen, Tabulator, Zeilenumbruch, Wagenrücklauf) am Anfang, Ende oder auf beiden Seiten eines Strings. In C++ läuft dies im Kern darauf hinaus, das erste und letzte Nicht-Leerzeichen zu finden und einen Teilstring dazwischen zu erzeugen.

\n\n

Typische Szenarien, in denen das Trimmen von Strings in C++ kritisch ist:

\n
    \n
  • Formularvalidierung – der Benutzer hat versehentlich ein Leerzeichen vor der E-Mail gesetzt
  • \n
  • Parsen von Konfigurationsdateien – Strings wie "key = value "
  • \n
  • Arbeit mit Netzwerkprotokollen – überflüssige Zeichen zerstören Header
  • \n
  • Log-Analyse – Leerzeichen behindern die Suche und den Vergleich
  • \n
\n\n

Methode 1: Klassisches manuelles Trimmen (C++98/03)

\n\n

Die älteste und verständlichste Methode ist die Verwendung von find_first_not_of und find_last_not_of. Diese Methoden suchen nach dem ersten/letzten Zeichen, das NICHT in einer bestimmten Menge enthalten ist (standardmäßig Leerzeichen).

\n\n
#include <string>\n#include <cctype>\n\nstd::string trim(const std::string& str) {\n    const std::string whitespace = " \\t\\n\\r\\f\\v";\n    size_t start = str.find_first_not_of(whitespace);\n    if (start == std::string::npos)\n        return ""; // string besteht nur aus Leerzeichen\n    size_t end = str.find_last_not_of(whitespace);\n    return str.substr(start, end - start + 1);\n}
\n\n

Vorteile: funktioniert mit jedem C++-Standard, keine Abhängigkeiten. Nachteile: erzeugt einen neuen String (Kopie). Für die meisten Aufgaben ist das kein Problem, aber wenn Sie Millionen von Strings trimmen, sollten Sie über die Leistung nachdenken.

\n\n

Methode 2: In-Place-Trimmen (C++11)

\n\n

Wenn Sie den ursprünglichen String ohne Kopieren ändern möchten, verwenden Sie erase und Iteratoren. Diese Methode ist besonders nützlich bei der Arbeit mit großen Puffern.

\n\n
#include <string>\n#include <algorithm>\n\nstd::string& trim_in_place(std::string& str) {\n    const std::string whitespace = " \\t\\n\\r\\f\\v";\n    // Vorne entfernen\n    str.erase(0, str.find_first_not_of(whitespace));\n    // Hinten entfernen\n    size_t end = str.find_last_not_of(whitespace);\n    if (end != std::string::npos)\n        str.erase(end + 1);\n    return str;\n}
\n\n

Beachten Sie: Nach dem erase am Anfang wird der String verschoben, was bei sehr langen Strings teuer sein kann. Für typische Fälle (bis zu 10K Zeichen) ist es jedoch hervorragend geeignet.

\n\n

Methode 3: Verwendung von <algorithm> und Lambdas (C++17)

\n\n

Modernes C++ ermöglicht deklarativeren Code. Wir verwenden std::find_if_not, um das erste Nicht-Leerzeichen zu finden.

\n\n
#include <string>\n#include <algorithm>\n#include <cctype>\n\nstd::string trim_modern(const std::string& str) {\n    auto is_space = [](unsigned char ch) { return std::isspace(ch); };\n    \n    auto start = std::find_if_not(str.begin(), str.end(), is_sp                

Blogs

Buchempfehlungen