Подтвердить что ты не робот

Удалить пробел в std::string

В С++, какой простой способ включить:

Этот std::string

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

В:

HELLOWORLDHELLOWORLD
4b9b3361

Ответ 1

Простая комбинация 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() ); }

Ответ 2

Если С++ 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() );

PS. Используется удаление идиомы

Ответ 3

В С++ 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());

Ответ 4

Вы можете использовать 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) удаляют только пробелы из начала и конца строки.

Ответ 5

С++ 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

Ответ 6

Пройдя через него символ по символу и используя 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--;
        }
    }
}