【问题标题】:C++ string library, to get a string by removing the integers in it [closed]C ++字符串库,通过删除其中的整数来获取字符串[关闭]
【发布时间】:2013-10-28 18:00:21
【问题描述】:

我有一个像“Hello world 1 2 3”这样的字符串,我想得到一个像“Hello World”这样的字符串。你知道它有什么功能吗?

【问题讨论】:

  • 您需要更具体。您是否要排除数字,是否还想要“S123ABC”之类的字符串等等...
  • 循环 0-9,用空字符串替换每个实例。在您的示例中,您可能还想修剪前导/尾随空格。

标签: c++ string int


【解决方案1】:

作为第一个近似值,假设您希望删除所有数字并将结果放入一个新字符串中,我将从以下内容开始:

std::remove_copy_if(your_string.begin(), your_string.end(), 
                    std::back_inserter(new_string),
                    [](unsigned char ch) { return isdigit(ch); });

【讨论】:

  • 我认为您甚至可以避免使用 lambda,而只需将 isdigit 作为一元谓词传递。
  • @MatteoItalia:你可以,但是char 签名的实现上(这是大多数),当你传递一个值为负的字符时,它会给出 UB。
  • 刚刚检查了C标准,就像你说的那样......他们在想什么? (尽管可以说 TRWTF 是 char 通常已签名)
  • @MatteoItalia:至少在委员会介入时,我怀疑他们的大部分想法是他们无法真正解决问题,所以他们能做的最好的事情就是提出要求明确的。
【解决方案2】:

从字符串中删除所有数字

string x
x.erase(
  std::remove_if(x.begin(), x.end(), &isdigit), 
  x.end());

【讨论】:

    【解决方案3】:

    这通常使用std::ctype<char> facet 来对包括空白字符在内的字母数字进行分类:

    #include <locale>
    #include <functional>
    
    template <class charT = char>
    bool digit_removal(charT c, std::locale loc)
    {
        return std::use_facet<std::ctype<charT>>(loc).is(
            std::ctype_base::digit, c);
    }
    
    int main()
    {
        std::string var = "Hello 123";
        var.erase(
            std::remove_if(var.begin(), var.end(),
              std::bind(&digit_removal<char>, std::placeholders::_1, std::locale())),
        var.end());
    
    
        std::cout << var; // "Hello "
    }
    

    【讨论】:

    • 如果你走这条路(我通常这样做),你会希望只提取一次构面,而不是每次调用都执行该功能。 (如果你使用函数对象而不是函数,这很简单。)
    • @JamesKanze 我会记住这一点。谢谢。 :)
    • 无意冒犯,但这是一个完美的例子,说明 C++ 倾向于过度复杂化和过度冗长简单的事情。 C++ 语言环境库+functors+bind=一大堆不可读的混乱。
    • @MatteoItalia 我认为唯一过分的是bind 部分。这部分可以缩短。
    • 别担心,我认为您的代码正是标准库的用途,事实上 IMO 的问题在于标准库。您不应该需要这种混乱来从字符串中删除数字(事实上,删除所有“C++ 语言环境”部分会删除大部分内容);令我不安的不是在 Python 中这将是单行的,而是在 C 中它会更短,最重要的是,更容易理解。
    猜你喜欢
    • 2012-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-31
    • 1970-01-01
    • 2012-10-02
    • 1970-01-01
    相关资源
    最近更新 更多