strtod()模糊:格式错误和零转换

时间:2015-10-01 20:21:49

标签: c

我考虑使用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和错误格式化字符串之间的模糊性问题,而另一篇文章则是关于检测格式化错误。

2 个答案:

答案 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);
}