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