Was ist die bevorzugte Methode zum Entfernen von Leerzeichen aus einer Zeichenfolge in C++? Ich könnte alle Zeichen durchlaufen und eine neue Zeichenfolge erstellen, aber gibt es einen besseren Weg?
Entfernen Sie Leerzeichen aus std::string in C++
Steve Hanow
Matt Preis
Verwenden Sie am besten den Algorithmus remove_if
und isspace:
remove_if(str.begin(), str.end(), isspace);
Jetzt kann der Algorithmus selbst den Container nicht ändern (nur die Werte ändern), also mischt er die Werte tatsächlich herum und gibt einen Zeiger darauf zurück, wo das Ende jetzt sein sollte. Wir müssen also string::erase aufrufen, um die Länge des Containers tatsächlich zu ändern:
str.erase(remove_if(str.begin(), str.end(), isspace), str.end());
Wir sollten auch beachten, dass remove_if höchstens eine Kopie der Daten erstellt. Hier ist eine Beispielimplementierung:
template<typename T, typename P>
T remove_if(T beg, T end, P pred)
{
T dest = beg;
for (T itr = beg;itr != end; ++itr)
if (!pred(*itr))
*(dest++) = *itr;
return dest;
}
-
Da „isspace“ Überladungen hat, müssen Sie wahrscheinlich den generischen Code qualifizieren, um ::isspace (die C-Implementierung, die kein Gebietsschema akzeptiert) zu verwenden, oder Sie werden mit kryptischen Fehlern bei der Instanziierung von Vorlagen begrüßt.
– Bklyn
5. Januar 2009 um 15:10 Uhr
-
Alle – seien Sie vorsichtig mit der obigen Methode (Die beiden einzelnen Zeilen, nicht die Vorlagenversion, obwohl es möglicherweise das gleiche Problem gibt). Ich habe es in einem Projekt verwendet, ohne zu wissen, dass es nicht immer richtig ist. Wenn Sie ihm zum Beispiel die Zeichenfolge „1 + 1“ übergeben, gibt es „1+11“ zurück. Ich bin unten zur Methode von @rupello gewechselt und es hat für diesen Fall gut funktioniert. Viel Spaß beim Codieren!
– JoeB
19. April 2012 um 18:43 Uhr
-
@Joe Die Antwort erwähnt ausdrücklich, dass Sie anrufen müssen
erase
danach. Das wird das richtige Ergebnis zurückgeben.– Konrad Rudolf
15. September 2012 um 7:17 Uhr
-
-1 diese Verwendung von
isspace
ist UB für alle Zeichensätze außer dem ursprünglichen 7-Bit-ASCII. C99 §7.4/1. es überrascht nicht mir, dass es inzwischen mit 71 Stimmen positiv bewertet wurde, obwohl es sich um einen sehr schlechten Rat handelt.– Prost und hth. – Alf
25. Oktober 2012 um 13:48 Uhr
-
Um es noch einmal zu wiederholen, der Code in dieser Antwort übergibt negative Werte (anders als EOF) an
isspace
für alle Nicht-ASCII-Zeichen, mit der in der Praxis standardmäßig gewählten Vorzeichenbelegung fürchar
. So hat es undefiniertes Verhalten. Ich wiederhole es, weil ich einen absichtlichen Versuch vermute, diese Tatsache in Lärm zu ertränken.– Prost und hth. – Alf
10. September 2014 um 22:07 Uhr
std::string::iterator end_pos = std::remove(str.begin(), str.end(), ' ');
str.erase(end_pos, str.end());
-
Meine positive Stimme für die kanonische Redewendung Löschen/Entfernen. Kann in einen Einzeiler umgewandelt werden: str.erase (std::remove (str.begin(), str.end(), ‘ ‘), str.end());
– Bklyn
5. Januar 2009 um 15:08 Uhr
-
Hinweis: Sie müssen einschließen
<algorithm>
damit das funktioniert.– Tara
13. Juli 2016 um 1:36 Uhr
Rupello
Von Spieleentwickler
string.erase(std::remove_if(string.begin(), string.end(), std::isspace), string.end());
-
Dies wird aufgrund der Locale-nehmenden Überladungen von std::isspace nicht auf standardkonformen Implementierungen kompiliert. Sie müssen ::isspace verwenden oder einige unlesbare Machenschaften mit std::bind2nd ausführen. Ist generischer Code nicht schön?
– Bklyn
5. Januar 2009 um 15:23 Uhr
-
Beachten Sie auch, dass, wenn eines der Zeichen negativ ist (z. B. ein UTF8-Zeichen, wenn char signiert ist), die Verwendung von
::isspace
ist U.B.– Martin Bonner unterstützt Monika
2. Dezember 2019 um 8:38 Uhr
-
C++17-Lösung:
string.erase(std::remove_if(string.begin(), string.end(), [](unsigned char x) { return std::isspace(x); }), string.end());
– Michael Steller
12. April 2021 um 16:44 Uhr
Nemanja Trifunović
Können Sie Boost String Algo verwenden? http://www.boost.org/doc/libs/1_35_0/doc/html/string_algo/usage.html#id1290573
erase_all(str, " ");
Benutzer2281802
Sie können diese Lösung zum Entfernen eines Zeichens verwenden:
#include <algorithm>
#include <string>
using namespace std;
str.erase(remove(str.begin(), str.end(), char_to_remove), str.end());
-
#include < string.h > using namespace std;
– Slackmart
21. Mai 2013 um 23:50 Uhr
-
Diese Lösung ist für mich richtig. Der obere ist es nicht.
– Jason Liu
15. Oktober 2017 um 23:24 Uhr
-
Die Verwendung von Namespace std sollte vermieden werden. stackoverflow.com/questions/1452721/…
– unendlichnull
11. April 2018 um 8:54 Uhr
Christian
Zum Trimmen verwenden Boost-String-Algorithmen:
#include <boost/algorithm/string.hpp>
using namespace std;
using namespace boost;
// ...
string str1(" hello world! ");
trim(str1); // str1 == "hello world!"
-
#include < string.h > using namespace std;
– Slackmart
21. Mai 2013 um 23:50 Uhr
-
Diese Lösung ist für mich richtig. Der obere ist es nicht.
– Jason Liu
15. Oktober 2017 um 23:24 Uhr
-
Die Verwendung von Namespace std sollte vermieden werden. stackoverflow.com/questions/1452721/…
– unendlichnull
11. April 2018 um 8:54 Uhr
Vinayak Garg
Hallo, so etwas kann man machen. Diese Funktion löscht alle Leerzeichen.
string delSpaces(string &str)
{
str.erase(std::remove(str.begin(), str.end(), ' '), str.end());
return str;
}
Ich habe eine andere Funktion erstellt, die alle unnötigen Leerzeichen löscht.
string delUnnecessary(string &str)
{
int size = str.length();
for(int j = 0; j<=size; j++)
{
for(int i = 0; i <=j; i++)
{
if(str[i] == ' ' && str[i+1] == ' ')
{
str.erase(str.begin() + i);
}
else if(str[0]== ' ')
{
str.erase(str.begin());
}
else if(str[i] == '\0' && str[i-1]== ' ')
{
str.erase(str.end() - 1);
}
}
}
return str;
}