namespace cpp

C++ lernen, kennen, anwenden

Benutzer-Werkzeuge

Webseiten-Werkzeuge


howto:trim_string

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

howto:trim_string [2016-12-10 16:20] (aktuell)
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, const std::​string&​ 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, const std::​string&​ delim = " \t\r\n"​)
 +{
 +  return s.erase(0, s.find_first_not_of(delim.c_str()));​
 +}
 +
 +std::string trim(std::​string s, const std::​string&​ 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.
howto/trim_string.txt · Zuletzt geändert: 2016-12-10 16:20 (Externe Bearbeitung)