为什么 sprintf() 生成问号字符作为输出?

Why sprintf() generates the question mark character, as output?

在处理嵌入式项目时,我注意到以下代码的 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;
};

以上所有使用 C/C++ 以及 VS Code 的 Platform.io 扩展。

这是怎么回事?

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

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

char ln2[16];

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