我目前正在调试有时有效的代码,有时却没有。 它是一个OBJ文件加载器,我找到了产生问题的部分:
double val = strtod(str, &endptr);
为了解释这个问题,我将举例说明strtod
被调用后的值。
str = "-0.021344"
val = -0
*endptr = '.'
在该行后面进行错误检查,如果*endptr != '\0'
引发错误。
现在当然会抛出错误,因为strtod
将点标记为数字的结尾,
但为什么会这样呢?另请注意,我在QT项目中使用代码时只遇到此错误。
感谢您的想法。
答案 0 :(得分:7)
也许你正在使用小数点不是.
的 locale 。在setlocale(LC_NUMERIC, "C");
声明之前尝试strtod
。
注意:我不知道区域设置和QT如何一起表现。您可能希望保存并恢复区域设置...
char *saved_locale;
saved_locale = setlocale(LC_NUMERIC, "C");
/* do your strtod thing */
setlocale(LC_NUMERIC, saved_locale);
答案 1 :(得分:4)
所有使用文本表示的C函数都受区域设置的影响。
您的语言区域是什么?在某些情况下,小数点实际上是,
。
答案 2 :(得分:1)
小数点取决于区域设置。
来自the manual:
十进制数由一个非空的十进制数字序列组成,可能包含一个基数字符(小数点,依赖于语言环境,通常是''。''),可选地后跟一个十进制指数。十进制指数由''E''或''e''组成,后跟可选的加号或减号,后跟非空的十进制数字序列,并表示乘以10的幂。