Entfernen Sie Leerzeichen aus std::string in C++

Lesezeit: 4 Minuten

Entfernen Sie Leerzeichen aus stdstring in C
Steve Hanow

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 stdstring in C
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 isspacefür alle Nicht-ASCII-Zeichen, mit der in der Praxis standardmäßig gewählten Vorzeichenbelegung für char. 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

1646944812 125 Entfernen Sie Leerzeichen aus stdstring in C
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


1646944813 302 Entfernen Sie Leerzeichen aus stdstring in C
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, " "); 

1646944814 899 Entfernen Sie Leerzeichen aus stdstring in C
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

1646944814 173 Entfernen Sie Leerzeichen aus stdstring in C
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

1646944815 88 Entfernen Sie Leerzeichen aus stdstring in C
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;
}

988940cookie-checkEntfernen Sie Leerzeichen aus std::string in C++

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy