[string] Leerzeichen abschneiden
-
Hi,
da die Foren-Suche nichts ergeben hat, diese alltäglich Frage:
Wie schneide ich bei einem String die Leerzeichen vorn und hinten ab?Bisher mache ich das folgendermaßen:
string tmp; getline(file, tmp); string::iterator it = tmp.begin(); string::size_type count = 0; while (it!=tmp.end() && isspace(*it)) { ++it; ++count; } tmp.erase(0, count); string::reverse_iterator rev_it = tmp.rbegin(); count = 0; while (rev_it!=tmp.rend() && isspace(*rev_it)) { ++rev_it; ++count; } tmp.erase(tmp.size()-count, string::npos);Geht das besser?
Grüße,
don_basto.//EDIT: Kode debuggt

-
Ich würd aus dem ganzen noch eine Templatefunktion machen.
-
-
Hallo,
die boost-Variante ist sicher die sinnvollste, wenn man sowieso schon boost verwenden.Händisch kann man es z.B. auch so machen:
void trimA(std::string& s) { typedef int (*Sig)(int); s.erase(s.begin(), std::find_if(s.begin(), s.end(), not1(ptr_fun(static_cast<Sig>(isspace))))); s.erase(std::find_if(s.rbegin(), s.rend(), not1(ptr_fun(static_cast<Sig>(isspace)))).base(), s.end()); }Das ist aber unter Umständen nicht ganz korrekt (siehe char vs. unsigned cahr vs. int Problematik).
Besser also:struct IsSpace : std::unary_function<char, bool> { bool operator()(char c) const { return isspace(static_cast<unsigned char>(c)) != 0; } }; void trim(std::string& s) { s.erase(s.begin(), std::find_if(s.begin(), s.end(), not1(IsSpace()))); s.erase(std::find_if(s.rbegin(), s.rend(), not1(IsSpace())).base(), s.end()); }
-
mit boost::algorithm::trim
-
und was ist mit tabulatoren?
also folgender string:
"\t \t hallo welt\t \t \t "
würde das damit etwa klappen? Also die trim funktion aus PHP frisst alles

-
+++++++++++ schrieb:
und was ist mit tabulatoren?
also folgender string:
"\t \t hallo welt\t \t \t "
würde das damit etwa klappen? Also die trim funktion aus PHP frisst alles

Wie wär's wenn du's einfach ausprobierst? Klar, ist ein völlig unintuitives Konzept, erspart dir aber wenigstens den Blick in die Doku....