0

我正在做一些字符串操作,并使用字符串迭代器循环遍历字符串,并在某些条件下将字符插入字符串。这是代码:

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插入时,它在我身上崩溃并抱怨迭代器 + 运算符超出范围。虽然,当我调试时,它确实传递了正确的偏移量。它确实成功地将 char 插入到字符串中,但是在函数执行后,迭代器指向损坏的数据。

4

2 回答 2

3

for(string::iterator i = rtrn->begin(); i != rtrn->end(); i++) { if(*i == ' ') rtrn->erase(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;
}
于 2013-03-31T03:51:48.020 回答
0

因此,经过你们的研究和帮助,看来我必须改进我的代码,以便任何字符串函数(如擦除、插入或替换)都可以在传递给函数的迭代器上写入。所以我需要把我的代码改成这样

for(string::iterator k = rtrn->begin(), m=k+1; m != rtrn->end(); k=m, m=k+1)
{
    if(*k == '-' && !Operator::isValidNum(*m))
        rtrn->replace(k, m, "-1*");
    if((Operator::isValid(&*m, garbage) != Operator::INVALID && (Operator::isValid(&*m, garbage) != Operator::SYM || *m=='(')) &&
    (Operator::isValid(&*k, garbage) == Operator::VAR || Operator::isValidNum(*k) || *k==')') &&
    !(Operator::isValid(&*k, garbage) == Operator::NUM && Operator::isValid(&*m, garbage) == Operator::NUM))
    {
        if(Operator::isValid(&*k, garbage) == Operator::SYM)
        {
            if(opSymb::valid[garbage]->getArguments())
        rtrn->insert(m, '*');
        }
        else
        {
            m=rtrn->insert(m, '*');
        }
    }
}
于 2013-04-01T02:16:14.353 回答