2012-06-05 80 views
1

我在這裏得到了aho-corasick算法的代碼:http://www.komodia.com/aho-corasick使用aho-corasick algorothm發生崩潰?

我用它作爲指南說,添加線條並構建樹。

但是我改變它從使用std wstring到std字符串,但這應該不重要。我只是改變了typedef。

當我使用它並搜索某些東西時,如果找不到結果就沒有問題。當找到結果時,我會得到一個標準超出範圍的異常。

它崩潰的位置:

 if (aIterator==pNode->aMap.end()) 
      //No, check if we have failure node 
      if (!pNode->pFailureNode) 
      { 
       //No failure node, start at root again 
       pNode=&m_aRoot; 

       //Reset search string 
       sMatchedString=""; 

       //Did we do a switch? 
       if (bSwitch) 
        //We need to do this over 
        --iCount; 

       //Exit this loop 
       break; 
      } 
      else 
      { 
       //What is the depth difference? 
       unsigned short usDepth; 
       usDepth=pNode->usDepth-pNode->pFailureNode->usDepth-1; 

       //This is how many chars to remove 
       sMatchedString=sMatchedString.substr(usDepth,sMatchedString.length()-usDepth); //CRASHES HERE!! 

       //Go to the failure node 
       pNode=pNode->pFailureNode; 

       //Set to switch 
       bSwitch=true; 
      } 
     else 
     { 
      //Add the char 
      sMatchedString+=rString[iCount]; 

      //Save the new node 
      pNode=aIterator->second; 

      //Exit the loop 
      break; 
     } 
    } 

它崩潰的位置:

sMatchedString=sMatchedString.substr(usDepth,sMatchedString.length()-usDepth); 

下面是變量:

enter image description here

我用這個來實現的審查遊戲。

什麼可能導致它崩潰?

我有一些字符串添加兩次,可能會導致問題?

由於

+2

投票結束:要求陌生人通過檢查發現代碼中的錯誤並不是富有成效的。您應該使用調試器或打印語句來識別(或至少隔離)問題,然後回來一個更具體的問題(一旦您將其縮小到10行[測試案例](http:///sscce.org))。 –

回答

1

一個可能的問題是,sMatchedString"u",而usDepth是3。這導致從第三個字符(在一個字符串)的子帶的長度-2。