c++: string::insert(string::iterator _where, char _Ch) 突然不工作了

标签 c++ stl

我正在执行一些字符串操作,并使用字符串迭代器遍历字符串,并在特定条件下将字符插入到字符串中。这是代码:

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/

相关文章:

c++ - C++ 中有标准的日期/时间类吗?

c++ - 黑莓 10 : GNU STL

c++ - C++中的类查找

c++ - 如何在 C++ 中丢弃 const

c++ - std::thread对象构造过程中的细节

C++ SFML 2.1 未定义对 GLEW 的引用

c++ - Qt Creator编译器配置问题visual studio 2017

algorithm - 试图提高数组中此搜索的效率

c++ - 我该如何定义这个复杂的函数模板呢?

c++ - 将基场设置为零