【问题标题】:Reading std::string, remove all special characters from a std::string读取 std::string,从 std::string 中删除所有特殊字符
【发布时间】:2014-01-25 03:30:08
【问题描述】:

我对这个论坛和 C++ 很陌生。所以请原谅我的疑虑/问题。我正在尝试阅读std::string。我知道我可以使用at[int] 运算符访问这些元素。我有两个问题:

1) 删除或擦除字符串中的所有特殊字符(包括空格)

2) 只读取该字符串的前 4 个字符或字母

对于 1),我正在检查 std::erasestd::remove_if,但我也需要消除所有特殊字符和空格。这意味着我需要包含isspace()/isalpha() 等所有条件。没有一种方法可以一次性全部删除吗?

对于 2),我可以像访问数组一样访问字符串,我的意思是 string[0]、string[1]、string[2]、string[3]。但我不能将它添加到单个字符串中?

请告诉我如何实现这一目标?

【问题讨论】:

  • 哪些字符是“特殊字符”?
  • 是的,我的意思是所有在我们键盘的第二排。

标签: c++ regex string c++11 split


【解决方案1】:

获取前四个字符:

std::string first4=str.substr(0, 4);

要删除任何 isspace 和 isalpha 谓词(虽然我想我误解了,这里的意思是 isspace 而不是 isalpha 吗??):

str.erase(std::remove_if(str.begin(), str.end(),
    [](char c) { return std::isspace(c) || std::isalpha(c); } ),
    str.end());

您可以使用op+= 附加到字符串。例如:

str+="hello";
str+='c';

【讨论】:

    【解决方案2】:

    要删除所有特殊字符,为什么不做一个这样的方法:

    bool isLegal(char c)
    {
      char legal[] = {'a', 'A', 'b','B' /*..and so on*/};
      int len = sizeof(legal)/sizeof(char);
    
      for (int i = 0; i < len; i++)
        if (c == legal[i])
          return true;
      return false;
    }
    

    然后只遍历字符串并删除不合法的字符?

    【讨论】:

      【解决方案3】:

      对于 1:std::remove_if 将删除给定谓词返回 true 的所有元素。您提供谓词函数对象,它可以是您想要的任何对象,只要它从您的容器 (char) 中获取一个元素并返回一个布尔值。

      所以你可以写一个函数如:

      bool IsNotLegal(const char & stringElement);
      

      或者您可以将其编写为 lambda 函数,然后您可以将其传递给 std::remove_if 以在 1 遍中从字符串中删除满足您条件的所有内容。

      std::string myString{"This is my string."};
      std::remove_if(std::begin(myString), std::end(myString),[](const char & element)
      {
          return std::isspace(element) && //any other conditions such as your own IsSpecial();
      });
      // now myString has become "Thisismystring."
      

      【讨论】:

        【解决方案4】:

        旧东西,但这是我的解决方案。

          void ClearSpecialCharacters(std::string &strText, const std::string& strAllowed)
        {
            const std::string cAllowed = strAllowed; //"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890,.-";
            
            
            auto new_end = std::remove_if(strText.begin(), strText.end(),
                                          [cAllowed](std::string::value_type c)
                                          { return cAllowed.find(c) == std::string::npos; });
            
            
            
            strText.erase(new_end, strText.end());
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-04-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多