应该分别使用std :: stof和atof之间的区别是什么?

时间:2019-09-10 06:47:39

标签: c++ c++11

例如,我已经阅读了一些有关每个文件的文件

http://www.cplusplus.com/reference/string/stof/

http://www.cplusplus.com/reference/cstdlib/atof/

我知道atof<cstdlib>的一部分,并且以const char*作为输入参数,而std::stof<string>的一部分,并且具有不同的输入格式。

但是不清楚,

  • 它们可以互换使用吗?
  • 它们是否使用相同的输入转换为相同的float值?
  • 哪种方案最适合用于这些方案?

2 个答案:

答案 0 :(得分:8)

我假设您打算将std::atofstd::stod(两者都返回std::atof)进行比较。

仅比较两个链接的参考页面会产生以下差异:

  • char*使用std::stod,而std::string使用std::wstringstd::stod(即,它支持宽字符串)
  • 如果pos参数不是NULL(用于进一步解析字符串),
  • double还将返回第一个未转换字符的索引。
  • 如果转换后的值不在std::atof的范围内,则std::stod将返回一个未定义的值,而std::out_of_range将抛出一个std::atof异常(绝对优于一个未定义的值)
  • 如果无法执行任何转换,则0.0将返回std::stod,而std::invalid_argument将引发0.0异常(易于区分 actual 转换为std::stod

这些都是<img srcset="elva-fairy-320w.jpg 320w, elva-fairy-480w.jpg 480w, elva-fairy-800w.jpg 800w" sizes="(max-width: 320px) 280px, (max-width: 480px) 440px, 800px" src="elva-fairy-800w.jpg" alt="Elva dressed as a fairy"> 的积极点,使其成为2的更高级替代。

答案 1 :(得分:1)

桑德所说的一切都是正确的。但是,您专门问过:

它们可以互换使用吗?

答案是否定的,至少在一般情况下不是。如果您使用的是atof,则很可能拥有旧版C代码。在这种情况下,您必须谨慎地引入可能引发异常的代码,尤其是在“常规”情况下,例如用户输入错误的代码。

它们是否通过相同的输入转换为相同的float值?

不。它们都转换为double值,而不是浮点数。 (据我所知)标准并不能特别保证转换为相同的值,并且四舍五入的地方可能略有不同。但是,在给出有效输入的情况下,如果同一编译器中两者的返回值之间存在差异,我将感到非常惊讶。

哪种方案最适合用于这些方案?

如果:

  • 您拥有符合要求的C ++ 11或更高版本的编译器,并且
  • 您的代码可以容忍异常(或者您愿意在每次调用时捕获它们),并且
  • 您已经有一个std :: string,或者转换对性能的影响并不重要。
  • 或者,如果您是C ++初学者,并且不知道这些问题的答案。

然后我建议使用std :: stod。否则,您可以考虑使用atof。