2

私は C++ 用のブースト ライブラリを使用していますが、関数 lexical_cast の動作が非常に奇妙です。lexical_cast("0.07513994") を実行すると正常に動作しますが、変換する必要がある変数を使用すると、bad_lexical_cast 例外がスローされます。コードは次のとおりです。

string word;
istringstream iss(line);
do
{
   string word;
   iss >> word;        
   double x;
   x = lexical_cast<double>(word);   
   cout << x << endl;
} while (iss);

ここで何が間違っていますか?助けていただければ幸いです、ありがとう

4

3 に答える 3

3

問題はおそらく、ループが予想よりも 1 回多く処理されることです。前回のループでは、word への読み取りが失敗し、iss に失敗ビットが設定されます。これは、while(iss) がチェックしているものです。それを修正するには、このようなことをする必要があります。

string word;
istringstream iss(line);
do
{
   string word;
   iss >> word; 
   if(iss)
   {       
     double x;
     x = lexical_cast<double>(word);   
     cout << x << endl;
   }
} while (iss);
于 2010-02-25T11:56:26.680 に答える
2

無効な文字を検出するとすぐに解析を停止する atof() などの関数とは異なり、lexical_cast では入力文字列のすべての文字が有効である必要があります。つまり、先頭または末尾にスペースがあると、例外がスローされます。

取得している入力の種類を確認し、それに応じてトリミングする必要があります。完全にガベージな入力を取得した場合に備えて、bad_lexical_cast もキャッチする必要があります。

考えられる解決策の 1 つは、boos.regex または boost.xpressive を使用して有効な部分文字列を抽出し、その結果を lexical_cast に渡すことです。

于 2010-02-25T11:56:36.417 に答える
2

問題はおそらく、データが残っていないときに空の文字列を送信していることです。
使用しているループを変更する必要があります。

while {} ループを使用します (「do while」ループではありません)。これにより、ストリームから読み取って、読みやすい単一のステートメントでテストできます。iss >> word の結果がストリームであることに注意してください。このブール値のコンテキストで使用すると、状態が良好かどうかがテストされ、その値が while 条件で使用できるものに変換されます。したがって、演算子 >> が正しく機能するように設定されている場合、ループには決して入りません。

istringstream iss(line);
string        word;
while(iss >> word)
{
    double x = lexical_cast<double>(word);   
    cout << x << endl;
}

しかし、実際には、この状況ではレキシカル キャストは必要ありません (例外を指定して非数値をテストする場合を除きます)。標準ストリーム演算子は、入力を double に変換します。

istringstream iss(line);
double        word;
while(iss >> word)
{
    cout << word << endl;
}
if (iss.fail())
{    /* Failure to convert input to a double */
}
于 2010-02-25T14:16:53.553 に答える