我想擦除字符串中的所有数字(最终是所有符号和空格),并保留字符串中的所有字母字符。我最终要做的是从大量文本中搜索回文。
用我现在得到的,它会擦除数字;加上被擦除的第一个数字字符之后的所有其他非数字字符。我想知道为什么这是这样做的,我能做些什么,使它只擦除数字字符。
#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;
}
for(int i=0; i<input.length(); i++){
if(isdigit(input.at(i))){
string::iterator it;
it=input.begin()+i;
input.erase(i);
break;
}
}
我不喜欢这段代码:决定使用迭代器或索引,我认为你不应该将它们混合使用。
在你的代码中有错误:当你从字符串中擦除时,它的长度也会改变(因此for循环将不起作用,而使用 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;
}
cin >> inputString;
for(string::iterator begin = inputString.begin(), end = inputString.end(); begin != end;){
if(isdigit(*begin)){
begin = inputString.erase(begin);
}else
++begin;
}
//cout << inputString;
我建议研究string.erase()
是如何工作的;接受一个参数的版本删除所提供的索引之后的所有内容。什么应该解决你的问题是改变input.erase(i)
到input.erase(i, 1)
。接受两个实参的版本从第一个实参的位置开始删除与第二个实参等量的字符。
还有,我看不出这两行在你的程序中的目的:
string::iterator it;
it=input.begin()+i;