删除std :: string中的空格

时间:2013-01-09 10:24:29

标签: c++ string c++11 removing-whitespace

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

这个std :: string

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

分为:

HELLOWORLDHELLOWORLD

6 个答案:

答案 0 :(得分:34)

std::remove_ifstd::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>或任何模板化字符类型。您当然也可以用不同的语言环境替换语言环境。如果你这样做,请注意避免重新创建区域设置方面的效率太高。

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

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

答案 1 :(得分: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());

或者使用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

答案 2 :(得分:4)

在C ++ 11中,您可以使用lambda而不是使用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 :(得分:3)

您可以使用Boost.Algorithmerase_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_lefttrim_copy_right)仅从字符串的开头和结尾删除空格。

答案 4 :(得分:3)

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

答案 5 :(得分:2)

逐个字符地逐步执行并使用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--;
        }
    }
}