使用擦除功能从字符串中删除字符 - C++



我想删除字符串中的无数字字符,这是我的代码:

int i=0;
while (num[i]!=NULL)
{
    if (!(num[i]>='0' && num[i]<='9'))
        num.erase(i,1);
    i++;
}

认为 num 是 e2,那么它应该只有 2,但它变成了"e"。或者如果 num 是 2er4,那么它将是 2e4,但它应该是 24,如何修复此代码?

你的代码有几个问题:首先,你的if条件是,当你声明你想要相反的字符时,如果它们是数字,则擦除它们。另一个问题是,当您擦除字符时,字符串的长度会更改,因此索引i不再有效。

然后,当字符作为位置i(由于我列出的第二个问题可能超出范围)未NULL时循环。但是NULL仅用于指针,如果有的话,你应该检查''。虽然我也不建议这样做,因为没有什么真正说明std::string中的字符串数据(我想num是)必须以零终止。而是使用字符串长度进行循环,或使用迭代器。

就像我在评论中所说的那样,只需调用单个函数,它就可以比您的代码简单得多。

正如Joachim所指出的,标准库为您提供了可以轻松用于实现目标的算法。从标准库容器中删除元素的常用方法是使用擦除删除习惯用法。在这种情况下,可以将std::string类视为容器,并且算法按预期工作。这是一个工作示例,其中 std::isdigit 函数用于确定从字符串中删除哪些元素:

#include <string>
#include <iostream>
#include <algorithm>
#include <cctype>
int main()
{
  std::string s = "abc123def456!!??";
  auto it = std::remove_if(s.begin(),
                           s.end(),
                           [](char c) { return std::isdigit(c);});
  s.erase(it, s.end());
  std::cout << s << std::endl;
}

最后我用Joachim Pileborg提示修复它,谢谢你,伙计;

int i=0;
while (num[i]!=NULL)
{
    if (!(num[i]>='0' && num[i]<='9'))
        {num.erase(i,1); if ((i-1)>=0) i--;}
    else i++;
}

最新更新