gpt4 book ai didi

C++: atof() 有错误的行为

转载 作者:行者123 更新时间:2023-11-28 03:13:21 25 4
gpt4 key购买 nike

我正在使用一个库将 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。我读到一些编译器在使用不包含“stdlib.h”的 atof() 时不会发出警告,结果是 atof() 返回一个整数。

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

有什么想法吗?

最佳答案

标准对 atof 说:

Except for the behaviour on error, it is equivalent to strtod(nptr,(char**)NULL)

所以你返回 '0' 与无法表示它或类似的 float 无关。

您是否会改用 strtod(当字符串流不是一个选项时您可能应该这样做,只是为了能够报告错误),那么您可能会注意到它在 . 处停止解析。

这强烈表明您正在使用等待 , 而不是 . 作为小数点分隔符的语言环境。根据您的应用程序如何使用区域设置,您可能希望使用正确设置的环境变量(例如 LC_NUMERIC=C)运行它或执行 setlocale(LC_NUMERIC,"C"); 在任何解析之前你自己。

在任何情况下,您都应该分析您的应用程序中谁在使用区域设置相关的东西,以及为了什么,以免与他们发生冲突。另一种可能的方法是在任何地方都要求依赖于区域设置的输入,所以每个人都需要用 , 作为小数点分隔符给你数字。

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com