代码之家  ›  专栏  ›  技术社区  ›  conopizda2

为什么我的静态数组没有被memset清除?

  •  0
  • conopizda2  · 技术社区  · 2 年前

    我想为嵌入式项目提供一个简单的浮点到字符串转换器,但不想使用浮点 snprintf 因为这会填满我的flash,所以我写了一个简单的转换函数。我真的不在乎小数的确切数字,也不在乎负值。这只是一个C++示例,我不想使用STL或其他C++特定函数,因为我在实际项目中确实受到空间限制。

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    
    char msg[100];
    
    typedef uint32_t u32;
    
    char* floatToString(float value)
    {
        static char placeholder[100];
        memset(placeholder, '\0', 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
    
    1 回复  |  直到 2 年前
        1
  •  1
  •   the busybee    2 年前

    您正在为转换后的值使用公共缓冲区。

    从评估的顺序来看 在你的系统上 显然,首先计算最右边的参数,你只看到最后一次11.35的转换。

    你可以通过以下方式解决:

    • 分别打印转换后的值
    • 使用另一种缓冲(动态、本地到调用方等)

    注意:您需要格式化 "%lu.%03lu" 以获得正确的结果,例如23.007。