Сбой при использовании ахорайного алгоритма?
Я получил код для алгоритма ахораксика здесь: http://www.komodia.com/aho-corasick.
Я использовал его, как сказал гид, добавил линии и построил дерево.
Однако я изменил его с использования std wstring на std string, но это не должно иметь значения. Я просто изменил 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);
Вот переменные:
Я использую это для реализации цензуры в игре.
Что может привести к его падению?
У меня есть несколько строк, добавленных дважды, это может вызвать проблемы?
Спасибо
1 ответ
Одна из вероятных проблем заключается в том, что sMatchedString
является "u"
, в то время как usDepth равен 3. Это приводит к подстроке из третьего символа (в строке из одного символа) длиной -2.