Этот l oop
while (rule[k] != '|' )
{
curr.push_back(rule[k]);
k++;
}
будет продолжать работать без конца после того, как вы найдете последний '|'
, с неопределенным поведением в результате.
Это проще для решения с использованием stringstream
и '|'
в качестве разделителя «строки».
std::istringstream is(rule);
std::string word;
while (std::getline(is, word, '|'))
{
str.push_back(word);
}