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:

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);
}

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 update

C++17 erlaubt mit <string_view> eine leichtgewichtigere Variante, welche die ursprüngliche Zeichenkette nicht zerstört:

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;
}

Der daraus entstandene Zeichenbereich lässt sich wie oben gezeigt auch wieder einem String zuweisen.