2013-03-31 61 views
0

我正在做一些字符串操作,並通過我一個字符串迭代一個字符串循環,並在一定條件下插入字符到串。下面是代碼:C++:字符串::插入(字符串:迭代_where,焦炭_CH)突然不工作

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等於 「20倍(5X + 3)-6x(5X^2 + 11/2)」,我得到rtrn->insert(k+1, '*'); else語句下運行時錯誤時,它在字符串中獲得「5x^2」。基本上,它使6個插入時,它崩潰我和抱怨迭代+運營商不超出範圍。雖然,當我在調試時,它確實傳遞了正確的偏移量。它成功地將字符插入到字符串中,但在函數執行後,迭代器指向損壞的數據。

+1

您的擦除循環應該是對'std :: remove'(使用擦除刪除成語,當然)的調用。 – chris

+0

突然不工作,經常出現同一類「巧合工作」的問題。 –

+0

擦除不是問題。 – bathtub

回答

3

爲(串:迭代I = rtrn->開始(); I = rtrn->端();!我++){ 如果 (* I =='「) rtrn->擦除(ⅰ ); }

有在這樣的錯誤和所有代碼片段是這樣的:for循環`噸被用於從一個容器刪除元件,becase的擦除() - 無效相關的容器
所有迭代器 我給你到使用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; 
} 
+0

因此,擦除正在破壞數據?我不認爲這是問題,但,因爲我通過此方案中的字符串,沒有空間,它永遠不會刪除任何元素 – bathtub

+0

不,擦除不會損壞數據,但*不*無效指向字符串迭代器 – jalf

+0

好了,好了,這可能是在不同情況下的一個問題,但擦除從來沒有叫這個數據。 – bathtub

0

研究所以經過和你們的幫助,看來我必須改進我的代碼,以便任何串fu例如擦除,插入或替換寫入到傳遞給函數的迭代器上。所以我需要將我的代碼更改爲這樣的東西

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, '*'); 
     } 
    } 
}