为什么我的静态数组没有被 memset 清除?
Why is my static array not cleared by memset?
我想为嵌入式项目提供一个简单的浮点数到字符串转换器,并且不想使用浮点数 snprintf
,因为那会填满我的闪存,所以我编写了一个简单的转换函数。我真的不关心确切的小数位数或负值。这只是一个 C++ 示例,我不想使用 STL 或其他 C++ 特定函数,因为在实际项目中我真的受到 space 的限制。
#include <iostream>
#include <cstdio>
#include <cstring>
char msg[100];
typedef uint32_t u32;
char* floatToString(float value)
{
static char placeholder[100];
memset(placeholder, '[=10=]', sizeof placeholder);
auto root = (u32) value;
auto decimals = (u32) (value * 1000) % 1000;
snprintf(placeholder, 100, "%lu.%lu", root,
decimals);
return placeholder;
}
float weirdVal = 11.35;
int main(){
snprintf(msg, 100, "%s,%s", floatToString(weirdVal), floatToString(64.876));
std::cout << msg << '\n';
return 0;
}
当我测试函数并调用它时,我总是得到第一个通过的数字。我的输出是:
11.350,11.350
您正在为转换后的值使用公共缓冲区。
并且由于评估顺序 在您的系统上 显然首先评估最右边的参数,您只能看到 11.35 的最后一个转换。
您可以通过以下方式解决:
- 分别打印转换后的值
- 使用另一种缓冲(动态的,调用者本地的,...)
注意:您需要格式化 "%lu.%03lu"
以获得正确的结果,例如 23.007。
我想为嵌入式项目提供一个简单的浮点数到字符串转换器,并且不想使用浮点数 snprintf
,因为那会填满我的闪存,所以我编写了一个简单的转换函数。我真的不关心确切的小数位数或负值。这只是一个 C++ 示例,我不想使用 STL 或其他 C++ 特定函数,因为在实际项目中我真的受到 space 的限制。
#include <iostream>
#include <cstdio>
#include <cstring>
char msg[100];
typedef uint32_t u32;
char* floatToString(float value)
{
static char placeholder[100];
memset(placeholder, '[=10=]', sizeof placeholder);
auto root = (u32) value;
auto decimals = (u32) (value * 1000) % 1000;
snprintf(placeholder, 100, "%lu.%lu", root,
decimals);
return placeholder;
}
float weirdVal = 11.35;
int main(){
snprintf(msg, 100, "%s,%s", floatToString(weirdVal), floatToString(64.876));
std::cout << msg << '\n';
return 0;
}
当我测试函数并调用它时,我总是得到第一个通过的数字。我的输出是:
11.350,11.350
您正在为转换后的值使用公共缓冲区。
并且由于评估顺序 在您的系统上 显然首先评估最右边的参数,您只能看到 11.35 的最后一个转换。
您可以通过以下方式解决:
- 分别打印转换后的值
- 使用另一种缓冲(动态的,调用者本地的,...)
注意:您需要格式化 "%lu.%03lu"
以获得正确的结果,例如 23.007。