【问题标题】:boost lexical_cast throws exceptionboost lexical_cast 抛出异常
【发布时间】:2010-02-25 11:35:18
【问题描述】:

我正在为 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);

我在这里做错了什么?感谢您的帮助,谢谢

【问题讨论】:

  • 请显示流中的完整输入。
  • line的实际值是多少?如果转换失败,它lexical_cast 将抛出。在调用词法转换之前检查word 的字符串值,您可能会发现它不是您认为的那样。
  • 可能是该行以\n 之类的空格结尾吗?

标签: c++ boost lexical-cast


【解决方案1】:

您的问题可能是循环处理的次数比您预期的多一次。 最后一次通过循环,读到字失败,在 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);

【讨论】:

  • 或者去掉 do-while 循环,使用简单的 while 循环和while(iss &gt;&gt; word) { ... }。有了这个 do-while 循环,条件基本上是多余的。
  • Johannes 解决方案肯定更简洁。我只是想强调原始帖子中出了什么问题。
【解决方案2】:

与 atof() 等函数一看到无效字符就停止解析不同,lexical_cast 要求输入字符串中的每个字符都是有效的。即任何前导或尾随空格都会导致它抛出异常。

您想查看它正在获得什么样的输入并相应地对其进行修剪。您还应该捕获 bad_lexical_cast 以防它得到完全垃圾的输入。

一种可能的解决方案是使用 boos.regex 或 boost.xpressive 来提取有效的子字符串并将结果传递给 lexical_cast。

【讨论】:

    【解决方案3】:

    问题可能是您在没有剩余数据时发送了一个空字符串。
    你应该改变你正在使用的循环。

    使用 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 */
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-25
      • 1970-01-01
      • 2023-03-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多