Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 删除字符串中的所有空格_C++_String - Fatal编程技术网

C++ 删除字符串中的所有空格

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

错误消息:

/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<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;
//  ...