Leerzeichen aus String löschen
-
Hi,
der Titel sagt eigentlich alles,
ich hab nen String und weiss nicht wie ich die Leerzeichen
daraus entfernen kann.
Gibts dazu ne Funktion oder so?
-
Wenns ein std::string ist sieh dir das hier mal an:
http://cplusplus.com/reference/string/string/find/ und
http://cplusplus.com/reference/string/string/erase/
-
ja, aber ne schlechte.
-
Etwas eleganter:
string str("a b c"); str.assign(str.begin(), remove_if(str.begin(), str.end(), &isspace));
-
TyRoXx schrieb:
Etwas eleganter:
string str("a b c"); str.assign(str.begin(), remove_if(str.begin(), str.end(), &isspace));
Ich glaub so eine elegante Funktion hat er gesucht.
-
Statt die bleibenden Zeichen zu kopieren kann man auch die wegfallenden entfernen:
std::string str("a b c"); str.erase(std::remove(str.begin(), str.end(), ' '), str.end());
-
TyRoXx schrieb:
Etwas eleganter:
boost::algorithm::erase_all_copy()
-
#include <algorithm> #include <iostream> #include <cctype> #include <string> using namespace std; namespace { static bool is_space(char c) { // nötig, da std::isspace überladen ist *doh* return std::isspace(c); } } std::string remove_spaces(std::string const &str) { std::string ret; ret.reserve(str.size()); std::remove_copy_if(str.begin(), str.end(), std::back_inserter(ret), is_space); return ret; } int main() { std::cout << remove_spaces("a b c") << std::endl; }
Kóyaánasqatsi schrieb:
TyRoXx schrieb:
Etwas eleganter:
boost::algorithm::erase_all_copy()
noch besser (benötigt aber boost http://www.boost.org/doc/libs/release/doc/html/string_algo.html)
-
Kóyaánasqatsi schrieb:
TyRoXx schrieb:
Etwas eleganter:
boost::algorithm::erase_all_copy()
Je dicker die Bibliothek, desto kürzer der eigene Code.
-
Nur so für die Nachwelt:
for (unsigned long i = 0; i < line.size();) if (line[i] == ' ') line.erase(i, 1); else i++;
MfG
Scarabol
-
Scarabol schrieb:
Nur so für die Nachwelt:
for (unsigned long i = 0; i < line.size();) if (line[i] == ' ') line.erase(i, 1); else i++;
MfG
ScarabolHerzlichen Glückwunsch zum O(n²). Wenn es schon Algorithmen gibt, sollte man die auch nutzen,
std::remove
hat z.B. nur O(n).
-
Ja, dann wäre ja:
string result; for(std::size_t n = 0; n < str.size(); ++n) if(str[n] != ' ') result += str[n];
noch besser.
-
ipsec schrieb:
Scarabol schrieb:
Nur so für die Nachwelt:
for (unsigned long i = 0; i < line.size();) if (line[i] == ' ') line.erase(i, 1); else i++;
MfG
ScarabolHerzlichen Glückwunsch zum O(n²). Wenn es schon Algorithmen gibt, sollte man die auch nutzen,
std::remove
hat z.B. nur O(n).Naja ich will ja nur kleine Strings, damit quälen. Könntest du zu std::remove auch ein Beispiel posten? (so wie ich mit der for Schleife)
MfG
Scarabol
-
line.erase(std::remove(line.begin(), line.end(), ' '), line.end());
Ausgeschrieben und mit Indices statt Iteratoren ist das in etwa:
unsigned j = 0; for(unsigned i = 0; i < line.size(); ++i) if(line[i] != ' ') line[j++] = line[i]; line.resize(j);
-
Edit: Hier stand Müll