我正在执行一些字符串操作,并使用字符串迭代器遍历字符串,并在特定条件下将字符插入到字符串中。这是代码:
string * const Expression::process(char * const s)
{
if(s == NULL)
{
printf("(from Expression::process())\n > NULL data");
return NULL;
}
string *rtrn = new string(s);
string garbage;
//EDIT
rtrn->erase(remove(rtrn->begin(), rtrn->end(), ' '), rtrn->end());
for(string::iterator j = rtrn->begin(); (j+2) != rtrn->end(); j++)
{
if(Operator::isValid(&*j, garbage) != Operator::SYM && *(j+1) == '-' && (Operator::isValid(&(*(j+2)), garbage) != Operator::INVALID))
rtrn->replace(j+1, j+2, "+-");
}
rtrn->insert(rtrn->begin(), '(');
rtrn->append(")");
for(string::iterator k = rtrn->begin(); k+1 != rtrn->end(); k++)
{
if(*k == '-' && !Operator::isValidNum(*(k+1)))
rtrn->replace(k, k+1, "-1*");
if((Operator::isValid(&*(k+1), garbage) != Operator::INVALID && (Operator::isValid(&*(k+1), garbage) != Operator::SYM || *(k+1)=='(')) &&
(Operator::isValid(&*k, garbage) == Operator::VAR || Operator::isValidNum(*k) || *k==')') &&
!(Operator::isValid(&*k, garbage) == Operator::NUM && Operator::isValid(&*(k+1), garbage) == Operator::NUM))
{
if(Operator::isValid(&*k, garbage) == Operator::SYM)
{
if(opSymb::valid[garbage]->getArguments())
rtrn->insert(k+1, '*');
}
else
{
rtrn->insert(k+1, '*');
}
}
}
return rtrn;
}
当 s
等于“20x(5x+3)-6x(5x^2+11/2)”时,我在 rtrn->insert(k +1, '*');
当它到达字符串中的“5x^2”时在 else 语句下。基本上,当它进行第 6 次th 插入时,它在我身上崩溃并提示迭代器 + 运算符超出范围。虽然,当我调试时,它确实传递了正确的偏移量。它确实成功地将 char 插入到字符串中,但在函数执行后,迭代器指向损坏的数据。
最佳答案
for(string::iterator i = rtrn->begin(); i != rtrn->end(); i++) { 如果(*我=='') rtrn->删除(i);
这个和所有这样的代码片段都存在错误:for 循环不能用于从容器中删除元素,因为 erase() - 使与容器,
我建议您改为使用 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;
}
关于c++: string::insert(string::iterator _where, char _Ch) 突然不工作了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15726113/