C++ 删除字符串中的所有空格
错误消息: /home/satish/Desktop/CPP/Remove_Spaces/main.CPP | 9 |错误:调用'Remove_ifstd::basic_string::iterator,std::basic_string::iterator,'| 首先,std::isspace在中声明,以便包含它 其次,您需要通过将函数强制转换为显式类型来消除重载的歧义:C++ 删除字符串中的所有空格,c++,string,C++,String,错误消息: /home/satish/Desktop/CPP/Remove_Spaces/main.CPP | 9 |错误:调用'Remove_ifstd::basic_string::iterator,std::basic_string::iterator,'| 首先,std::isspace在中声明,以便包含它 其次,您需要通过将函数强制转换为显式类型来消除重载的歧义: #include<iostream> #include<string> #include<a
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int main()
{
string str;
cin>>str;
str.erase(remove_if(str.begin(), str.end(), isspace),str.end());
cout<<str;
return 0;
}
正如注释中所指出的,您缺少std::isspace的include,即。但即使这样,你也不会成功,因为iSpace已经超载了 重载问题的解决方案是显式地将函数指针强制转换为所需的函数:
bool char_isspace(char c) {
return std::isspace(static_cast<unsigned char>(c));
}
…
str.erase(
remove_if(str.begin(), str.end(), char_isspace),
str.end());
C++11:如上所述,由于lambda使用char C作为参数,所以在C++11中没有多态lambda
C++03 with boost:使用boost::bind为remove\u if创建谓词
试着这样做:
struct IsSpace {
bool operator()(char c) {
return std::isspace(c, cin.getloc());
}
};
str.erase(
remove_if(str.begin(), str.end(),
IsSpace()
),
str.end());
如果可以预测结果大小,或者只使用原始大小就足够了,那么result.reserve将提高性能。因为到目前为止,所有答案都涉及未定义的行为 最简单的解决方案,如果你有C++11, 是: 您可能还需要IsNotSpace和相应的对象 剩下的是。。。在中起作用 或者,您可以使用的语言环境感知版本 职能包括: 虽然有点复杂,但它完全支持区域设置,并且 实际上需要更少的代码,因为掩码可以是模板
参数。请签出:除了include之外,您还需要使用::isspace,以便使用isspace的C实现,该实现有一个locale作为参数。@Angew谢谢!它工作得非常好@是的。然而,公认的答案提到了过载的存在。更改了链接以引用该答案。很抱歉,我仍然打开了指向std::isspace文档的链接,并错误地认为您已链接到该页面。与@KonradRudolph的注释相同:您不能调用std::isspace的版本,该版本只包含一个带字符的参数。这是未定义的行为。@只有在传递非ascii字符时才使用JamesKanze。然而,我更新了答案以考虑到这一点account@ArneMertz他从某处得到了一条std::字符串。你怎么能确定里面没有负值呢。现在还有没有使用普通ASCII的系统。除了在大多数系统上用字符调用这个版本的isspace是未定义的行为之外。因为标准C这么说。标头声明了在所有情况下用于分类和映射字符的多个函数。参数为int,其值应表示为无符号字符或等于宏EOF的值。如果参数有任何其他值,则行为未定义。增加了脓胸。普通字符转换为int时,将产生负值,这些负值不能表示为无符号字符。@James那么,你是说在C中,调用isspace“ß”是未定义的,因为普通字符文本的类型为int并且可以有符号?是的。当然,大多数情况下,您只会得到随机结果,因为isspace的传统实现只是使用参数作为表的索引,表前面的内存通常会被映射。我使用过的Sun C至少有一个实现实际上复制了表的一部分,所以负索引起作用了——除了isspace“ÿ”,因为“ÿ”的代码恰好是-1,与EOF相同。@James。谢谢你提供的信息,我不知道。我非常讨厌C。
str.erase(remove_if(str.begin(), str.end(), static_cast<int(*)(int)>(&std::isspace)),str.end());
str.erase(
remove_if(str.begin(), str.end(),
[](auto c){ return isspace(c, cin.getloc());}
),
str.end());
str.erase(
remove_if(str.begin(), str.end(),
boost::bind(&std::isspace<char>, _1, boost::ref(cin.getloc()))
),
str.end());
struct IsSpace {
bool operator()(char c) {
return std::isspace(c, cin.getloc());
}
};
str.erase(
remove_if(str.begin(), str.end(),
IsSpace()
),
str.end());
#include <iostream>
#include <string>
#include <algorithm>
struct SpaceRemover
{
bool operator( )( char _ch ) { return std::isspace( _ch ); }
};
int main( )
{
std::string strSource = " type ddd ";
std::cout << "[main] Source string :\""<< strSource << "\"" << std::endl;
std::string::iterator itEnd = std::remove_if( strSource.begin(),
strSource.end(),
SpaceRemover( ) );
strSource.resize( std::distance( strSource.begin(), itEnd ) );
std::cout << "[main] Result string :\""<< strSource << "\"" << std::endl;
return 0;
}
#include <iostream>
int main() {
std::string original = " type ddd ";
std::string result;
for(char c: original) {
if( ! std::isspace(c)) result += c;
}
original.swap(result);
std::cout << "Modified: " << original << std::endl;
return 0;
}
str.erase(
std::remove_if(
str.begin(),
str.end(),
[]( char ch ) { return isspace( static_cast<unsigned char>( ch ) ); } ),
str.end() );
struct IsSpace
{
bool operator()( char ch ) const
{
return isspace( static_cast<unsigned char>( ch ) );
}
};
template <std::ctype_base>::mask mask, bool is>
class Is
{
std::locale m_toEnsureLifetime;
std::ctype<char> const* m_ctype;
public:
Is( std::locale const& l = std::locale() )
: m_toEnsureLifetime( l )
, m_ctype( &std::use_facet<std::ctype<char>>( m_toEnsureLifetime ) )
{
}
bool operator()( char ch ) const
{
return m_ctype->is( mask, ch ) == is;
}
};
typedef Is<std::ctype_base::space, true> IsSpace;
typedef Is<std::ctype_base::space, false> IsNotSpace;
// ...