为什么我不能删除字符串的数字字符?

时间:2013-03-31 03:12:34

标签: c++ string erase

我想要删除字符串中的所有数字(最终是所有符号和空格)并将所有字母字符保留在字符串中。我最终要做的是从大块文本中搜索回文。

我现在得到的东西会抹掉数字;加上第一个被删除的数字字符后的所有其他非数字字符。我想知道为什么这样做以及我可以做什么来使它只擦除数字字符。

#include <iostream>
#include <string>
#include <cctype>
#include <ctype.h>
#include <iterator>
using namespace std;

int main()
{
bool con = true;
while (con == true)
{
cout << "Enter a string: ";
string input;
getline(cin, input);

/** here is where I am attempting to erase all numeric characters in input string**/    
for(int i=0; i<input.length(); i++){

    if(isdigit(input.at(i))){

        string::iterator it;
        it=input.begin()+i;
        input.erase(i);
    break;
    }
}

string go;

cout << input << endl;

    cout << "Continue? y/n " << endl;
    getline(cin, go);
    if( go != "y")
        con = false;


}
system("pause");
return 0;
}

3 个答案:

答案 0 :(得分:1)

for(int i=0; i<input.length(); i++){

    if(isdigit(input.at(i))){

        string::iterator it;
        it=input.begin()+i;
        input.erase(i);
    break;
    }
}

我不喜欢那段代码片段:决定使用迭代器或索引,我想你不应该把它们混合
代码中有错误:当你从一个字符串中删除时它的长度也会改变(所以对于循环不起作用,而不是使用while循环

string::iterator it = input.begin();

    while (it != input.end())
    {
         while( it != input.end() && isdigit(*it))
         {
              it = input.erase(it);
         }
         if (it != input.end())
             ++it;
    }

答案 1 :(得分:1)

cin >> inputString;
for(string::iterator begin = inputString.begin(), end = inputString.end(); begin != end;){
  if(isdigit(*begin)){
    begin = inputString.erase(begin);
  }else
    ++begin;
}
//cout << inputString;

答案 2 :(得分:0)

我建议研究string.erase()的工作原理;采用一个参数的版本会删除所有包含所提供索引的内容。解决问题的方法是将input.erase(i)更改为input.erase(i, 1)。采用两个参数的版本删除的字符数量等于从第一个参数位置开始的第二个参数。

另外,我在你的程序中没有看到这两行的目的:

string::iterator it;
it=input.begin()+i;