我正在尝试简单地将双精度转换为C中的字符串。
char printable[9];
snprintf(printable, 9, "%f", 30.356145);
应将printable设置为“30.35614”。当我运行此代码on an online c compiler时,它会正确输出。当我在我的微控制器上输出它时,打印等于这个废话:
"\000\033\000\000\001\000\000\000\024"
答案 0 :(得分:5)
从输出中可以看出snprintf
立即终止了带有\0
字符的字符串,其余部分保持不变。由于数组是在堆栈上分配的而不是零初始化的,因此其余的数组值是不确定的。
正如@ CountMurphy评论所证实的那样,问题在于使用了C库newlib-nano
。
在微控制器上,Flash很珍贵,printf
和相关功能是库中最大的功能之一。因此,在嵌入式微控制器上,我们倾向于删除不必要的事情,如float
和double
格式说明符处理代码。
通过明确激活printf
中的浮点newlib-nano
支持解决了该问题,正如官方资源here和here中所指示的那样。激活支持的一种方法是添加链接器标志
-u _printf_float
到最后的arm-none-eabi-gcc
命令。这将强制包含符号/函数_printf_float
,随后使%f
格式说明符按预期工作。