我想删除字符串中没有数字的字符,这是我的代码:
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,如何修复此代码?
答案 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++;
}