Just as my fingers' auto-delete macro was about to fire …— Herb Sutter
Am Anfang und/oder am Ende einer Zeichenkette stehende Leerzeichen (Tabulatoren, Zeilenumbrüche = "white space") sollen verschwinden.
Die Standardbibliothek bietet keine vorgefertigte Methode.
Die Suchmethoden der string
-Klasse stellen aber alles Notwendige bereit:
//: trim.cpp : Zeichen an Anfang/Ende eines string entfernen - R.Richter 2011-05-22 /////////////////////////////////////////////////////////////////////////////////// #include <string> std::string rtrim(std::string s, std::string const& delim = " \t\r\n") { std::string::size_type last = s.find_last_not_of(delim.c_str()); return last == std::string::npos ? "" : s.erase(last + 1); } std::string ltrim(std::string s, std::string const& delim = " \t\r\n") { return s.erase(0, s.find_first_not_of(delim.c_str())); } std::string trim(std::string s, std::string const& delim = " \t\r\n") { return ltrim(rtrim(s, delim), delim); }
Die Lösung ist allgemeiner anwendbar:
std::string s = " Text "; s = trim(s); // s = "Text" s = trim("+++ Nachricht +++", " +"); // s = "Nachricht"
Sollen lediglich "Wörter" aus Nichtleerzeichen extrahiert werden, kann man auch einen Zeichenkettenstrom benutzen:
std::string s = " Das ist ein Text "; std::istringstream in(s); // #include <sstream> std::string wort; while (in >> wort) { // ... wort verarbeiten }
C++17 erlaubt mit <string_view> eine leichtgewichtigere Variante, welche die ursprüngliche Zeichenkette nicht zerstört:
#include <string_view> auto trim(std::string_view sv, std::string_view delimiters = " \t\r\n") { sv.remove_prefix(std::min(sv.find_first_not_of(delimiters), sv.size())); auto pos = sv.find_last_not_of(delimiters); if (pos != sv.npos) sv.remove_suffix(sv.size() - (pos + 1)); return sv; }
Der daraus entstandene Zeichenbereich lässt sich wie oben gezeigt auch wieder einem String zuweisen.