2

我正在为 c++ 使用 boost 库,函数 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

您的问题可能是循环处理的次数比您预期的多一次。最后一次通过循环,读到字失败,在 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 以防万一它确实获得了完全是垃圾的输入。

一种可能的解决方案是使用 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;
}

但实际上,在这种情况下,您甚至不需要词法转换(除非您想测试有异常的非数字)。标准流运算符会将输入转换为双精度。

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 回答