将字符串转换为浮点数

4

我正在使用AtmelStudio在AVR XMEGA微控制器上编程。

我想把一个字符串转换成浮点数,该字符串称为token2,其值为"8.604165"

我已经尝试了一些函数:

  • float lon = atof(token2); printf("lon=%f", lon); 返回 lon=?
  • float lon = strtod(token2, NULL); printf("lon=%f", lon); 返回 lon=?
  • float lon = strtof(token2, NULL); printf("lon=%f", lon); 出现错误undefined reference to strtof,即使包括了<stdlib.h>

我做错了什么吗?


你的代码可能很好:看看这个例子 - LPs
4
请提供一个“最小、完整、可验证的示例”(MCVE)。您是否正在为微控制器编写代码?如果是,请指定环境。也许与此相关:c - Arduino:printf / fprintf打印问号而不是浮点数-Stack Overflow - MikeCAT
是的 @MikeCAT。我正在使用AVR XMega 微控制器编程。 - Francisco Estêvão
1
看起来你的问题是在于 printf,而不是转换。尝试使用 printf("lon=%f", 8.604165);,并告诉我们你看到了什么。顺便说一句,在第三个要点中,我不会描述它为 '返回一个错误',因为这里没有 "return"(这是编译错误,而不是运行时错误)。 - barak manos
此外,请使用调试器并告诉我们在调用 atofstrtodlon 的值是多少。 - barak manos
代码中是否有语句 #include <stdlib.h>?代码是否使用以下定义之一进行编译:_XOPEN_SOURCE >= 600 || _ISOC99_SOURCE || _POSIX_C_SOURCE >= 200112L; 或 cc -std=c99 - user3629249
2个回答

6
默认情况下,AVR-libc 试图通过不链接浮点数相关的库来节省二进制空间。对于像 atof 这样的函数来说很容易,因为如果您不调用它们,链接器就不会将它们包含在内。但是对于 printf 来说,链接器无法确定您是否计划使用它来处理浮点数。
相反,AVR-libc 有多个库定义了 printf。默认库中的 printf 具有全部功能,除了不支持浮点数。如果您想在二进制文件中节省空间,并且您没有使用 printf 的更高级功能(即格式标志),则可以使用 printf_min 链接以替换它,该版本更小。如果要打印浮点数,则需要在 printf_flt 中定义的完整版本。 此页面 描述了选择这些替代版本的适当链接器选项。简而言之,请将 -Wl,-u,vfprintf -lprintf_flt -lm 添加到您的链接器选项中。

0

好的,这是微控制器特有的东西。

就像@Sneftel所说的那样,我只需要在AtmelStudio中添加库libprintf_flt.alibm.a


3
这种做法并不仅适用于这个集成开发环境,对于使用较小微控制器的情况来说,使用浮点数会使代码大小增加很多,这是一个普遍存在的问题。在某些设备中,根本没有浮点数运算功能,而在另一些设备中,浮点数运算则是通过链接选项来选择是否包含该功能的特定版本。 - crlanglois

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接