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

时间:2013-09-25 07:17:33

标签: c++ windows-7 codeblocks

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

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,如何修复此代码?

3 个答案:

答案 0 :(得分:1)

您的代码存在一些问题:第一个问题是,当您声明想要相反时,if条件是擦除字符(如果它们是数字)。另一个问题是,当您擦除字符时,字符串的长度会发生变化,因此索引i不再有效。

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

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

答案 1 :(得分:1)

正如Joachim所指出的,标准库为您提供了可以轻松实现目标的算法。从标准库容器中删除元素的常用方法是使用erase remove idiom。在这种情况下,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;
}

答案 2 :(得分:0)

最后我用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++;
}