3

在处理嵌入式项目时,我注意到sprintf()以下代码的方法:

  char ln2[16];
  sprintf(ln2, "%f Volt", Data[Position].Voltage1);

生成问号字符作为输出。

从上面的代码生成的输出是:

? Volt

而输入被声明为double Voltage1 = 0.0;

在尝试格式化整数时,同样的问题似乎并不适用。
以下按预期工作:

  char ln1[16];
  sprintf(ln1, "POSITION %d", (Position + 1));

并输出POSITION 3其中Position是全局变量并声明为int

实际保存数据的结构是:

struct data
{
  int Position;
  double Voltage1;
  double Voltage2;
};

以上都是针对 VS Code使用C/C++Platform.io扩展。

这里出了什么问题?

4

2 回答 2

6

printf 的嵌入式版本通常不实现浮点数处理。您需要让链接器链接正确版本的函数。例如对于 ARM gcc,它将是-u _printf_floator/and-u _scanf_float

于 2019-11-20T20:47:46.160 回答
2

ln2指向字符串文字。字符串文字是只读的,因此当您尝试写入它时,您会调用undefined behavior

您应该改为定义ln2为可写的字符数组。

char ln2[16];
于 2019-11-20T19:17:46.537 回答