我正在使用一个库将Wavefront .obj文件加载到OpenGL应用程序(tinyobjloader)中。我注意到加载对象时出现错误。当我加载一个对象的坐标例如0.9999999设置为0。通过调试,我发现以下方法会产生此行为:

static inline float parseFloat(const char*& token)
{
    token += strspn(token, " \t");
    float f = (float)atof(token);
    token += strcspn(token, " \t\r");
    return f;
}


因此atof()会以某种方式返回int,而不是float。我读到一些编译器在使用atof()时不包含“ stdlib.h”就不会发出警告,结果是atof()返回一个整数。

奇怪的是,即使我包含“ stdlib.h”,错误仍然存​​在。我不知道是什么原因导致了这种行为。

任何想法?

最佳答案

该标准对atof说:


  除了错误行为外,它等同于
  strtod(nptr,(char **)NULL)


因此,您返回的“ 0”与浮点数不能表示它或类似值无关。

您将使用strtod代替(如果不能选择字符串流,可能只是为了报告错误而应该使用strtod),那么您可能会注意到它在.处停止了解析。

这强烈表明您使用的是等待,而不是.的语言环境作为s十进制分隔符。根据您的应用程序与语言环境一起使用的方式,您可能希望使用正确设置的环境变量(例如LC_NUMERIC=C)运行它,或者在进行任何解析之前自行执行setlocale(LC_NUMERIC,"C");

在任何情况下,您都应该分析应用程序中的谁在使用与语言环境相关的东西以及用于什么目的,以免与它们冲突。另一种可能的方法是在任何地方都需要依赖于语言环境的输入,因此每个人都需要使用,作为小数点分隔符将数字提供给您。

关于c++ - C++:atof()的行为错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17742606/

10-09 16:55