删除std :: string中的空格

Mr.*_*ith 22 c++ string removing-whitespace c++11

在C++中,有一种简单的方法:

这个std :: string

\t\tHELLO WORLD\r\nHELLO\t\nWORLD     \t
Run Code Online (Sandbox Code Playgroud)

成:

HELLOWORLDHELLOWORLD
Run Code Online (Sandbox Code Playgroud)

Cas*_*Cow 34

简单的组合std::remove_ifstd::string::erase.

不是完全安全的版本

s.erase( std::remove_if( s.begin(), s.end(), ::isspace ), s.end() );
Run Code Online (Sandbox Code Playgroud)

对于更安全的版本替换::isspace

std::bind( std::isspace<char>, _1, std::locale::classic() )
Run Code Online (Sandbox Code Playgroud)

(包括所有相关标题)

对于使用替代字符类型的版本,请替换<char><ElementType>您的模板化字符类型.您当然也可以用不同的语言环境替换语言环境.如果您这样做,请注意避免重新创建区域设置方面的效率太高.

在C++ 11中,您可以使用以下方法将更安全的版本转换为lambda:

[]( char ch ) { return std::isspace<char>( ch, std::locale::classic() ); }
Run Code Online (Sandbox Code Playgroud)

  • `isspace`对所有字符都有UB,除了那些基本的东西.C99§7.4/ 1. (4认同)
  • C++ 98将C标准库的行为委托给C89,C++ 11将C标准库的行为委托给C99. (2认同)

bil*_*llz 13

如果是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());
Run Code Online (Sandbox Code Playgroud)

或者使用C++ 11 lambda

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

PS.擦除remove惯用法使用