如何在尝试将Car *转换为C++中的双时检查双溢出
我想将C++中的字符转换为双。但在此之前,我想检查char*是否是正确的双精度数字。因此,我制定了以下代码:如何在尝试将Car *转换为C++中的双时检查双溢出,c++,string,casting,double,C++,String,Casting,Double,我想将C++中的字符转换为双。但在此之前,我想检查char*是否是正确的双精度数字。因此,我制定了以下代码: bool Tools::m_CheckIfDouble(char *p_nb) { if (p_nb == NULL) return (false); for (unsigned int v_i = 0; p_nb[v_i]; v_i++) if ((p_nb[v_i] < '0' || p_nb
bool Tools::m_CheckIfDouble(char *p_nb)
{
if (p_nb == NULL)
return (false);
for (unsigned int v_i = 0; p_nb[v_i]; v_i++)
if ((p_nb[v_i] < '0' || p_nb[v_i] > '9') && (p_nb[v_i] != '.' && p_nb[v_i] != '-'))
return (false);
return (true);
}
但是,如果char*的值大于DBL_MAX或小于DBL_MIX,我不知道如何检查char*是否存在双重溢出。标准库函数strod应该执行以下操作:
#include <cstdlib>
#include <cerrno>
double convert(char const * str)
{
char * e;
double res = std::strtod(str, &e);
if (e == str || *e != 0) { /* error (invalid string) */ }
if ((res == HUGE_VAL || -res == HUGE_VAL) && errno == ERANGE) { /* overflow */ }
if (res == 0 && errno == ERANGE) { /* underflow */ }
return res;
}
你明白了;您可以根据自己的要求自定义错误处理。请参阅:除非您有很好的理由不使用boost::lexical\u cast,否则我建议您使用它。此函数是否可以管理诸如双重溢出或int溢出之类的错误?@AJG85:这不仅无法实现合理的错误检查,而且strod是C89和C++98的一部分,所以这两种标准都是如此。啊,是的,的确如此。它看起来就像@aelnajjar指出的新的C++11函数之一。