首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >boost lexical_cast抛出异常

boost lexical_cast抛出异常
EN

Stack Overflow用户
提问于 2010-02-25 19:35:19
回答 3查看 6.5K关注 0票数 2

我对c++使用的是boost库,而lexical_cast函数的行为非常奇怪。如果我使用lexical_cast("0.07513994"),它工作得很好,但是如果我使用我需要转换的变量,它会抛出bad_lexical_cast异常。代码如下:

代码语言:javascript
复制
string word;
istringstream iss(line);
do
{
   string word;
   iss >> word;        
   double x;
   x = lexical_cast<double>(word);   
   cout << x << endl;
} while (iss);

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-02-25 19:56:27

您的问题可能是循环被处理的时间比您预期的多一次。在最后一次环路中,read to字失败,设置iss中的fail位,这是while(iss)正在检查的位。要修复它,您需要执行以下操作。

代码语言:javascript
复制
string word;
istringstream iss(line);
do
{
   string word;
   iss >> word; 
   if(iss)
   {       
     double x;
     x = lexical_cast<double>(word);   
     cout << x << endl;
   }
} while (iss);
票数 3
EN

Stack Overflow用户

发布于 2010-02-25 19:56:36

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

您希望看到它得到的是哪种类型的输入,并对其进行相应的调整。你还应该捕获bad_lexical_cast,以防它得到的输入完全是垃圾。

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

票数 2
EN

Stack Overflow用户

发布于 2010-02-25 22:16:54

问题可能是在没有数据时发送的是一个空字符串。

你应该改变你正在使用的循环。

使用while {}循环(而不是'do while‘循环)。这允许您从流中读取并在单个易于阅读的语句中对其进行测试。请注意,iss >> word的结果是流。当在这个布尔上下文中使用时,会对其进行测试,以查看状态是否良好,并将其值转换为while条件可以使用的值。因此,如果运算符>>运行正常,则永远不会进入循环。

代码语言:javascript
复制
istringstream iss(line);
string        word;
while(iss >> word)
{
    double x = lexical_cast<double>(word);   
    cout << x << endl;
}

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

代码语言:javascript
复制
istringstream iss(line);
double        word;
while(iss >> word)
{
    cout << word << endl;
}
if (iss.fail())
{    /* Failure to convert input to a double */
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2333625

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档