为啥我不能删除字符串的数字字符?
Posted
技术标签:
【中文标题】为啥我不能删除字符串的数字字符?【英文标题】:Why can't I erase string's numeric characters?为什么我不能删除字符串的数字字符? 【发布时间】:2013-03-31 03:12:34 【问题描述】:我想删除字符串中的所有数字(最终是所有符号和空格)并保留字符串中的所有字母字符。我最终要做的是从大块文本中搜索回文。
用我现在得到的,它会抹去数字;加上被擦除的第一个数字字符之后的所有其他非数字字符。我想知道为什么这样做,以及我能做些什么来让它只擦除数字字符。
#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;
【问题讨论】:
请注意,您可以将std::remove_if
与 lambda 或 std::not1
和 std::isalpha
结合使用,以删除除字母之外的所有字符。对于数字字符,std::remove_if
和 std::isdigit
。
谢谢。那我就得用 isalpha 了。
@chris, std::isalpha
在这种情况下不起作用,因为它返回一个int
,而不是bool
。由于需要进行隐式类型转换,在这种情况下它会失败。
@NathanErnst,AFAIK,铸造它有效。
【参考方案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;
我不喜欢该代码 sn-p:决定使用迭代器或索引,我认为您不应该混合使用它们。您的代码中有错误:当您从字符串中删除时,它的长度也会发生变化(因此 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;
【讨论】:
是 i 来自它 = input.erase(i); ?使用 'it' 不会给出正确的输出。 opps,对不起,我忽略了它,它当然应该是迭代器。谢谢,我会调整的 w8ht 给出 8t 的输出。它丢弃了所有其他字符。 @Road Rash 在哪里";"如果,我纠正了它,检查它,一切正常 - 我检查了 它做得更好,但我注意到输入 345hf3 返回 4hf。 hello92 返回 hello2。基本上如果有两个或多个数字在一起,它将返回一个数字。我使用了 !isalpha,但仍然得到相同的结果。【参考方案2】:cin >> inputString;
for(string::iterator begin = inputString.begin(), end = inputString.end(); begin != end;)
if(isdigit(*begin))
begin = inputString.erase(begin);
else
++begin;
//cout << inputString;
【讨论】:
【参考方案3】:我建议研究string.erase()
的工作原理;采用一个参数的版本会删除所有内容,包括提供的索引。应该解决您的问题的方法是将input.erase(i)
更改为input.erase(i, 1)
。采用两个参数的版本从第一个参数位置开始删除与第二个参数相等的字符数。
另外,我在你的程序中看不到这两行的目的:
string::iterator it;
it=input.begin()+i;
【讨论】:
以上是关于为啥我不能删除字符串的数字字符?的主要内容,如果未能解决你的问题,请参考以下文章
为啥我的 if 函数没有从字符串中删除空格?它不能检测 C++ 中的空格输入吗?有没有办法从输入中删除空间