Я токенизирую строку, основанную на разделителе (используя Boost Tokenizer), а затем делаю вещи с токенами, основанными на значении переменной состояния.
Проблема, с которой я столкнулся: в одном из случаев требуется, чтобы строка была размечена. Это приводит к ошибкам, потому что переменные tok1 и token объявлены в регистре. Я пытался объявить их вне коммутатора и просто назначить их внутри корпуса, но это не работает.
Кто-нибудь знает способ, как я могу сделать это, или есть ли лучший способ пойти дальше токенизации строки внутри корпуса? Спасибо!
Пример кода ниже:
boost::char_separator<char> sep(TOKEN_DELIMETER_NEWLINE);
boost::char_separator<char> sep2(TOKEN_DELIMETER_SPACE);
tokenizer tok(_text, sep);
while(lineToken!=tok.end())
{
switch(state)
{
case FIRST_STATE:
lineToken++;
tokenizer tok1(*lineToken, sep2);
tokenizer::iterator token=tok1.begin();
break;
// Other Cases follow...
}
}
После заполнения пробелов я составил следующее:
std::string _text1 = "The rain,In Spain,Lies Mainly,On the plain";
boost::char_separator<char> sep(",");
boost::char_separator<char> sep2(" ");
boost::tokenizer<boost::char_separator<char>> tok(_text1,sep);
boost::tokenizer<boost::char_separator<char>>::iterator lineToken = tok.begin();
unsigned int state = 0;
while(lineToken!=tok.end())
{
switch(state)
{
case 0:
lineToken++;
boost::tokenizer<boost::char_separator<char>> tok1(*lineToken, sep2);
boost::tokenizer<boost::char_separator<char>>::iterator token=tok1.begin();
break;
// Other Cases follow...
}
}
Это работает для меня — ну, это компилирует и токенизирует … Обратите внимание, что мой пример не похож на ваш в том, что приращение итератора вызовет сбой до конца, потому что я не делаю никакой проверки …..
Может быть, вы не использовали шаблон или пропустили его?
попробуйте поместить «{}» вокруг новых переменных стека, что-то вроде этого,
case FIRST_STATE:
{
lineToken++;
tokenizer tok1(*lineToken, sep2);
tokenizer::iterator token=tok1.begin();
}
break;