在C++中,将以下内容转换为一个简单的方法:
这个std::string
这个std::string
\t\tHELLO WORLD\r\nHELLO\t\nWORLD \t
转化为:
HELLOWORLDHELLOWORLD
\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>
或您的模板字符类型。当然,您也可以用不同的语言环境来替换。如果这样做,请注意避免重新创建语言环境因素导致的低效率。
在C++11中,您可以使用以下lambda函数将更安全的版本转换为:
[]( char ch ) { return std::isspace<char>( ch, std::locale::classic() ); }
isspace
函数都具有未定义行为。此规定来自于 C99 标准第7.4/1节。 - R. Martinho Fernandesisspace
取一个 int
,而 char
是有符号的。这里有一个解释该问题的小程序 http://stacked-crooked.com/view?id=817f92f4a2482e5da0b7533285e53edb。 - R. Martinho Fernandes如果是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. 擦除删除成语 被使用了
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;
HELLOWORLDHELLOWORLD
在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());
您可以使用 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
)仅会从字符串开头和结尾删除空格。
XX___XX_
-> XX_XX
这样的事情,而我想要最终的解决方案是XXXX
。 - Mr. Smith逐个字符地分析并使用 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--;
}
}
}
i
。然后继续循环,增加i
,但不会检查第二个空格。 - Steve Jessop
cin
流,因此使用iostream函数。 - Mr. Smith