我对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);我在这里做错了什么?感谢您的帮助,谢谢
发布于 2010-02-25 19:56:27
您的问题可能是循环被处理的时间比您预期的多一次。在最后一次环路中,read to字失败,设置iss中的fail位,这是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-25 19:56:36
与atof()等函数不同,lexical_cast要求输入字符串中的每个字符都是有效的。也就是说,任何前导或尾随空格都会导致它抛出异常。
您希望看到它得到的是哪种类型的输入,并对其进行相应的调整。你还应该捕获bad_lexical_cast,以防它得到的输入完全是垃圾。
一种可能的解决方案是使用boos.regex或boost.xpressive提取有效的子字符串,并将结果传递给lexical_cast。
发布于 2010-02-25 22:16:54
问题可能是在没有数据时发送的是一个空字符串。
你应该改变你正在使用的循环。
使用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 */
}https://stackoverflow.com/questions/2333625
复制相似问题