我考虑使用strtod()函数将字符串转换为C中的double,其中siganture为:
double strtod (const char* str, char** endptr);
要转换的字符串str
和要设置为数字后第一个字符的endptr
指针。
文档说:
成功时,该函数将转换后的浮点数作为double类型的值返回。 如果无法执行有效转换,则函数返回零(0.0)。
因此,据我所知,无法检测str
格式错误的情况(例如" foo"," -3ab"或" 3o3")来自str
代表0的情况(例如" 0"," 0.000"," -0.0&# 34;," 0e10")。
如何使用strtod()函数来避免零转换中的问题?
编辑:我看到过类似的问题here。但是,我想我并没有问同样的问题,因为我的问题是关于0和错误格式化字符串之间的模糊性问题,而另一篇文章则是关于检测格式化错误。
答案 0 :(得分:2)
这正是你endptr
的原因所在。如果在通话endptr == str
之后,则未解析任何号码。
答案 1 :(得分:2)
另外,如果你想检测其他错误,比如“3.14xyz”,strtod会返回3.14,但是endptr会指向'x',所以,如果在strtod之后,'endptr'没有指向'str' AND'obpptr'指向仅空格(如果你想要严格,则指向<0),那么'str'确实是一个有效的浮点数。如果字符串'str'会引起溢出,则errno也会设置为ERANGE。
以下是它的实现:
bool isDouble(const char* s)
{
char* rest = (char*) s;
strtod(s, &rest);
if ((rest == s) || (errno == ERANGE))
return false;
// If all WS after the last char used in the conversion, then the string is considered a 'clean float'
while ((*rest == ' ') || (*rest == '\t') || (*rest == '\n'))
++rest;
return (*rest == 0);
}