为什么strtof总是在评估HUGE_VAL?

时间:2010-06-02 17:29:11

标签: c

这可能是什么问题?无论我为str选择什么号码,总是2681561585988519419914804999641169225495873164118478675544712​​2887443528060147093953603748596333806855380063716372972101707507765623893139892867298012168192.00

char *str = "2.6";
printf("%f\n", strtof(str, (char**)NULL));
//prints 26815615859885194199148049996411692254958731641184786755447122887443528060147093953603748596333806855380063716372972101707507765623893139892867298012168192.00

整个计划:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
    char *str = "2.6";
    printf("%f\n", strtof(str, NULL));
    return 1;
}

使用-Wall编译:

test4.c:7: warning: implicit declaration of function âstrtofâ

5 个答案:

答案 0 :(得分:8)

您为/ on构建了什么平台?你说的警告正在发出:

test4.c:7: warning: implicit declaration of function âstrtofâ

表示编译器不知道strtof()返回浮点数,因此它会将int推送到printf()调用而不是doublestrtof()通常在stdlib.h中声明,您将其包括在内。但它在C99之前不是标准函数,因此确切的编译器平台(以及您正在使用的配置/选项)可能会影响它是否可用。

答案 1 :(得分:4)

strtof仅在C99中定义。可能是将选项-std=c99传递给编译器会修复它,因为默认GCC(-std=gnu89)仅包含几个C99功能。

另一个选择是使用C89-kosher strtod。无论如何,从长远来看,这可能是更好的选择。 (除非在特殊情况下,你什么时候需要单打?)

答案 2 :(得分:3)

也许您忘记包含正确的标题?

#include <stdlib.h>
#include <stdio.h>

int main() {
    printf("%f\n", strtof("2.6", NULL));
    return 0;
}

产生

2.600000

对我来说......

答案 3 :(得分:3)

鉴于您的警告,您应该尝试添加-std = c99以从标头中获取C99标准定义。默认情况下,它将假定返回值为int,然后尝试将其转换为float。这显然是错的。或者,你可以简单地为strtof()提供你自己的正确声明。

答案 4 :(得分:2)

正如其他人所说,你需要-std = c99。但你也可以使用字符串加倍的strtod(),你不需要-std = c99。

我在使用glibc 2.5的CentOS 5.5上遇到strtof()问题,除非我使用-std = c99,但是strtod()工作得很好。