0

区切り文字に基づいて (Boost Tokenizer を使用して) 文字列をトークン化し、状態変数の値に基づいてトークンを処理します。

私が抱えている問題: ケースの 1 つは、文字列をさらにトークン化する必要があります。ケース内で 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...
    }

}
4

2 に答える 2

1

ギャップを埋めた後、次のようにコンパイルしました。

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...
}
}

これは私にとってはうまくいきます-コンパイルしてトークン化します....私の例は、チェックを行わないため、反復子のインクリメントが終了前にクラッシュを引き起こすという点で、あなたの例とは異なることに注意してください.....

テンプレートを使用していないか、見落としている可能性がありますか?

于 2012-10-25T22:52:07.213 に答える
0

次のように、新しいスタック変数を「{}」で囲んでみてください。

    case FIRST_STATE:

{

        lineToken++;
        tokenizer tok1(*lineToken, sep2);
        tokenizer::iterator token=tok1.begin();  

}

    break;
于 2012-10-25T22:11:05.293 に答える