En C++, quel est un moyen facile de tourner:
Cette chaîne std ::
\t\tHELLO WORLD\r\nHELLO\t\nWORLD \t
Dans:
HELLOWORLDHELLOWORLD
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 une version plus sûre, remplacez ::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. Vous pouvez bien sûr également remplacer les paramètres régionaux par un autre. Dans ce cas, prenez garde à éviter l'inefficacité de recréer trop souvent la facette locale.
En C++ 11, vous pouvez transformer la version plus sûre en lambda avec:
[]( char ch ) { return std::isspace<char>( ch, std::locale::classic() ); }
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. Erase-remove idiom est utilisé
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());
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
Vous pouvez 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 les espaces qu'au début et à la fin d'une chaîne.
Le parcourir caractère par caractère et utiliser 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--;
}
}
}