我正在为c ++使用boost libs,而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);
我在这里做错了什么?我感谢任何帮助,谢谢
答案 0 :(得分:2)
您的问题可能是循环再次处理超出预期。 在循环的最后一次,读取到单词失败,在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);
答案 1 :(得分:2)
与atof()等函数不同,它们在看到无效字符后立即停止解析,而lexical_cast要求输入字符串中的每个字符都有效。即任何前导或尾随空格都会导致它抛出异常。
你想看看它得到了什么样的输入并相应地修剪它。您还应该捕获bad_lexical_cast,以防它确实获得完全垃圾的输入。
一种可能的解决方案是使用boos.regex或boost.xpressive来提取有效的子字符串并将结果传递给lexical_cast。
答案 2 :(得分:2)
问题可能是当没有数据时你发送一个空字符串。
你应该改变你正在使用的循环。
使用while {}循环(而不是'do while'循环)。这允许您从流中读取并在一个易于阅读的语句中对其进行测试。注意iss的结果&gt;&gt;字是流。在此布尔上下文中使用时,将测试状态是否良好以及其值是否转换为while条件可以使用的值。因此,如果运营商&gt;&gt;申请正常工作,然后永远不会进入循环。
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 */
}