strtod()模糊:格式错误和零转换
我正在考虑使用strtod()函数将字符串转换为C中的double,其中siganture是:
double strtod (const char* str, char** endptr);
str
是要转换的字符串, endptr
指向要设置为数字后面的第一个字符的指针。
文件说:
成功时,该函数将转换后的浮点数作为double类型的值返回。 如果无法执行有效转换,则函数返回零(0.0)。
因此,据我所知,不可能从str
表示0的情况(例如“0”)检测str
具有格式错误(例如“foo”,“ – 3ab”或“3o3”)的情况。 ,“0.000”,“ – 0.0”,“0e10”)。
如何使用strtod()函数来避免零转换中的问题?
编辑 :我在这里看到了类似的问题。 但是,我想我不会问同样的问题,因为我的问题是关于0和错误格式化字符串之间的模糊性问题,而另一篇文章则是关于检测格式化错误。
另外,如果你想检测其他错误,比如“3.14xyz”,strtod会返回3.14,但是endptr会指向’x’,所以,如果在strtod之后,’endptr’没有指向’str’和’endptr ‘ 只指向空格(如果你想要严格,则指向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); }
这正是你有endptr
。 如果在调用endptr == str
,则没有解析数字。