namespace cpp {}

C++ lernen, kennen, anwenden

Benutzer-Werkzeuge

Webseiten-Werkzeuge


howto:trim_string

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.


howto:trim_string [2020-07-27 09:37] (aktuell) – angelegt - Externe Bearbeitung 127.0.0.1
Zeile 1: Zeile 1:
 +====== Leerzeichen am Anfang / Ende einer Zeichenkette entfernen ======
 +> 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:
 +<code cpp trim.cpp>
 +//: 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);
 +}
 +</code>
 +Die Lösung ist allgemeiner anwendbar:
 +<code cpp>
 +std::string s = " Text  ";
 +s = trim(s);                         // s = "Text"  
 +s = trim("+++ Nachricht +++", " +"); // s = "Nachricht" 
 +</code>
 +Sollen lediglich "Wörter" aus Nichtleerzeichen extrahiert werden, kann man auch einen Zeichenkettenstrom benutzen:
 +<code cpp>
 +std::string s = " Das ist ein Text ";
 +std::istringstream in(s);             // #include <sstream>
 +std::string wort;
 +
 +while (in >> wort)
 +{
 +  // ... wort verarbeiten
 +}
 +</code>
 +
 +===== C++17 update =====
 +C++17 erlaubt mit [[..:kennen:include:string_view]] eine leichtgewichtigere Variante, welche die ursprüngliche Zeichenkette nicht zerstört:
 +
 +<code cpp trim_sv.cpp>
 +#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;
 +}
 +</code>
 +Der daraus entstandene Zeichenbereich lässt sich wie oben gezeigt auch wieder einem String zuweisen.

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki