Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.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++ 如何从字符串中去除非ASCII字符?在c++;_C++_String_Strip - Fatal编程技术网

C++ 如何从字符串中去除非ASCII字符?在c++;

C++ 如何从字符串中去除非ASCII字符?在c++;,c++,string,strip,C++,String,Strip,如何从字符串中去除非ASCII字符 我想知道如何在c++中实现这一点,去掉大于127的所有内容,或者查看并创建一个更具体的范围 while (CrtChar) { if (*CrtChar<35 || *CrtChar>127) *CrtChar = ' '; } while(CrtChar) { 如果(*CrtChar127) *CrtChar=''; } 可能类似于: struct InvalidChar { bool operator()(char c) c

如何从字符串中去除非ASCII字符


我想知道如何在c++中实现这一点,去掉大于127的所有内容,或者查看并创建一个更具体的范围

while (CrtChar)
{
  if (*CrtChar<35 || *CrtChar>127)
   *CrtChar = ' ';
}
while(CrtChar)
{
如果(*CrtChar127)
*CrtChar='';
}
可能类似于:

struct InvalidChar
{
    bool operator()(char c) const {
        return !isprint(static_cast<unsigned char>(c));
    }
};

std::string s;
HypoteticalReadFileToString(&s);
s.erase(std::remove_if(s.begin(),s.end(),InvalidChar()), s.end());
void字符串净化器(std::string&s)
{
对于(std::string::iterator it=s.begin(),itEnd=s.end();it!=itEnd;++it)
{
if(静态施法(*it)<32 |静态施法(*it)>127)
{
(*它)='';
}
}
}
无效字符串净化器(std::string和dest,const std::string和source)
{
dest.reserve(source.size());
对于(std::string::const_迭代器it=source.begin(),itEnd=source.end();it!=itEnd;++it)
{
if(静态施法(*it)<32 |静态施法(*it)>127)
{
目的地推回(“”);
}
其他的
{
目的地推回(*it);
}
}
}

顺便说一句,在现实世界的应用程序中,通过剥离Unicode字符来“解决”代码中的错误是个坏主意。@Delan Azabani这只发生在文件末尾。我无法看到文件末尾的字符(手动)。您可能有bug。你确定你的字符串是以null结尾的吗?你需要显示一些代码、输入和输出。你的“字符串”中可能有垃圾,而不是unicode。这可能不起作用:如果unicode字符是两个字节呢?或者类似的怎么样?如果您只是在检查值,那么您可能也希望剥离低端@坦加拉杰:你是什么意思?如果你试过的话,它应该是有效的。你现在需要显示一些代码。你的逻辑是反的吗?应该是
return!isprint((无符号c))
?严格来说,这将删除的不仅仅是非ASCII字符。是的,它将删除的不仅仅是有效的ASCII字符。您可以在InvalidChar functor中使用比较。您可以在那里做任何您喜欢的事情。调试时,这可能会触发断言失败,因为非ASCII字符的
c
看起来是负数。@3noch,它将在哪里断言?强制转换为unsigned可防止将负值传递给isprint。这在过去阻止了我的主张。。如果没有强制转换,char将升级为int,这是isprint的函数签名。事实上,char是一种非常不寻常的类型,因为它与“signed char”或“unsigned char”的类型不同。不确定标准指定了什么-我认为char的符号可能是实现定义的,但不完全确定。
template <typename C, typename P> 
void erase_remove_if(C& c, P predicate) {
    c.erase(std::remove_if(c.begin(), c.end(), predicate), c.end());
}
erase_remove_if(s, InvalidChar());
void stringPurifier ( std::string& s )
{
    for ( std::string::iterator it = s.begin(), itEnd = s.end(); it!=itEnd; ++it)
    {
      if ( static_cast<unsigned int>(*it) < 32 || static_cast<unsigned int>(*it) > 127 )
      {
        (*it) = ' ';
      }
    }
}

void stringPurifier ( std::string& dest, const std::string& source )
{
  dest.reserve(source.size());
  for ( std::string::const_iterator it = source.begin(), itEnd = source.end(); it!=itEnd; ++it)
  {
    if ( static_cast<unsigned int>(*it) < 32 || static_cast<unsigned int>(*it) > 127 )
    {
      dest.push_back(' ');
    }
    else
    {
      dest.push_back(*it);
    }
  }
}