В С++, какой простой способ включить:
Этот std::string
\t\tHELLO WORLD\r\nHELLO\t\nWORLD \t
В:
HELLOWORLDHELLOWORLD
В С++, какой простой способ включить:
Этот std::string
\t\tHELLO WORLD\r\nHELLO\t\nWORLD \t
В:
HELLOWORLDHELLOWORLD
Простая комбинация std::remove_if
и std::string::erase
.
Не полностью безопасная версия
s.erase( std::remove_if( s.begin(), s.end(), ::isspace ), s.end() );
Для более безопасной версии замените ::isspace
на
std::bind( std::isspace<char>, _1, std::locale::classic() )
(Включите все соответствующие заголовки)
Для версии, которая работает с альтернативными типами символов, замените <char>
на <ElementType>
или на любой другой тип вашего шаблонного символа. Вы можете, конечно, также заменить языковой стандарт на другой. Если вы это сделаете, будьте осторожны, чтобы избежать неэффективности воссоздания языкового аспекта слишком много раз.
В С++ 11 вы можете сделать более безопасную версию в лямбда с помощью
[]( char ch ) { return std::isspace<char>( ch, std::locale::classic() ); }
Если С++ 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());
Или используйте С++ 11 lambda
s.erase(std::remove_if( s.begin(), s.end(),
[](char c){ return (c =='\r' || c =='\t' || c == ' ' || c == '\n');}), s.end() );
В С++ 11 вы можете использовать лямбда, а не использовать std:: bind:
str.erase(
std::remove_if(str.begin(), str.end(),
[](char c) -> bool
{
return std::isspace<char>(c, std::locale::classic());
}),
str.end());
Вы можете использовать Boost.Algorithm 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";
}
ПРИМЕЧАНИЕ: как указано в комментариях: trim_copy
(или его кузены trim_copy_left
и trim_copy_right
) удаляют только пробелы из начала и конца строки.
С++ 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
Пройдя через него символ по символу и используя string::erase()
, вы должны работать нормально.
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--;
}
}
}