Question supprimer les espaces dans std :: string [dupliquer]


Cette question a déjà une réponse ici:

En C ++, quel est un moyen facile de tourner:

Ce std :: string

\t\tHELLO WORLD\r\nHELLO\t\nWORLD     \t

Dans:

HELLOWORLDHELLOWORLD

21
2018-01-09 10:24


origine


Réponses:


Combinaison simple de std::remove_if et std::string::erase.

Version pas totalement sûre

s.erase( std::remove_if( s.begin(), s.end(), ::isspace ), s.end() );

Pour remplacer la version plus sûre ::isspace avec

std::bind( std::isspace<char>, _1, std::locale::classic() )

(Inclure tous les en-têtes pertinents)

Pour une version qui fonctionne avec d'autres types de caractères, remplacez <char> avec <ElementType> ou quel que soit votre type de personnage basé sur un modèle. Vous pouvez bien sûr également remplacer les paramètres régionaux par un autre. Si vous faites cela, faites attention à ne pas trop recréer la facette locale.

En C ++ 11, vous pouvez rendre la version plus sûre dans un lambda avec:

[]( char ch ) { return std::isspace<char>( ch, std::locale::classic() ); }

33
2018-01-09 10:26



Si C ++ 03

struct RemoveDelimiter
{
  bool operator()(char c)
  {
    return (c =='\r' || c =='\t' || c == ' ' || c == '\n');
  }
};

std::string s("\t\tHELLO WORLD\r\nHELLO\t\nWORLD     \t");
s.erase( std::remove_if( s.begin(), s.end(), RemoveDelimiter()), s.end());

Ou utilisez C ++ 11 lambda

s.erase(std::remove_if( s.begin(), s.end(), 
     [](char c){ return (c =='\r' || c =='\t' || c == ' ' || c == '\n');}), s.end() );

PS Effacer-supprimer idiome est utilisé


12
2018-01-09 10:34



En C ++ 11, vous pouvez utiliser un lambda plutôt que d'utiliser std :: bind:

str.erase(
    std::remove_if(str.begin(), str.end(), 
        [](char c) -> bool
        { 
            return std::isspace<char>(c, std::locale::classic()); 
        }), 
    str.end());

3
2018-02-10 20:06



Vous pourriez utiliser Boost.Algorithm's erase_all

#include <boost/algorithm/string/erase.hpp>
#include <iostream>
#include <string>

int main()
{
    std::string s = "Hello World!";
    // or the more expensive one-liner in case your string is const
    // std::cout << boost::algorithm::erase_all_copy(s, " ") << "\n";
    boost::algorithm::erase_all(s, " "); 
    std::cout << s << "\n";
}

NOTE: comme mentionné dans les commentaires: trim_copy (ou ses cousins trim_copy_left et trim_copy_right) ne supprime que les espaces au début et à la fin d'une chaîne.


2
2018-01-09 10:32



c ++ 11

std::string input = "\t\tHELLO WORLD\r\nHELLO\t\nWORLD     \t";

auto rs = std::regex_replace(input,std::regex("\\s+"), "");

std::cout << rs << std::endl;

/ tmp ❮❮❮ ./play

HELLOWORLDHELLOWORLD

2
2018-01-10 23:11



Traverser son caractère par caractère et en utilisant string::erase() devrait fonctionner correctement.

void removeWhitespace(std::string& str) {
    for (size_t i = 0; i < str.length(); i++) {
        if (str[i] == ' ' || str[i] == '\n' || str[i] == '\t') {
            str.erase(i, 1);
            i--;
        }
    }
}

1
2018-01-09 10:36