RT-thread rt_kprintf()函数格式化输出浮点数

使用rt-thread的同学可能会发现,RT官方预留的打印功能rt_kprintf无法输出小数(不知道是不是全部版本都这样,我这里使用的是3.1.4的版本出现这种情况,使用MCU为stm32)

即使用类似下方打印输出时

float num = 10.0f;
rt_kprintf("float %.2f\n", num);

输出的结果并不是

float 10.00

而是

float %f

查看了下rt_kprintf这个函数的实现方式后发现问题

官方对于这个函数的实现如下

void rt_kprintf(const char *fmt, ...)
{
    va_list args;
    rt_size_t length;
    static char rt_log_buf[RT_CONSOLEBUF_SIZE];

    va_start(args, fmt);
    /* the return value of vsnprintf is the number of bytes that would be
     * written to buffer had if the size of the buffer been sufficiently
     * large excluding the terminating null byte. If the output string
     * would be larger than the rt_log_buf, we have to adjust the output
     * length. */
    length = rt_vsnprintf(rt_log_buf, sizeof(rt_log_buf) - 1, fmt, args);
    if (length > RT_CONSOLEBUF_SIZE - 1)
        length = RT_CONSOLEBUF_SIZE - 1;
#ifdef RT_USING_DEVICE
    if (_console_device == RT_NULL)
    {
        rt_hw_console_output(rt_log_buf);
    }
    else
    {
        rt_uint16_t old_flag = _console_device->open_flag;

        _console_device->open_flag |= RT_DEVICE_FLAG_STREAM;
        rt_device_write(_console_device, 0, rt_log_buf, length);
        _console_device->open_flag = old_flag;
    }
#else
    rt_hw_console_output(rt_log_buf);
#endif
    va_end(args);
}

仔细看会发现官方这里格式化参数调用的接口是RT自己实现的

length = rt_vsnprintf(rt_log_buf, sizeof(rt_log_buf) - 1, fmt, args);

阅读了下RT实现的方法发现并没有对%f进行处理,因此把官方使用的接口替换成stdio.h中的

length = vsnprintf(rt_log_buf, sizeof(rt_log_buf) - 1, fmt, args);

再次打印小数就正常了,注意修改完需添加头文件,即

#include <stdio.h>

目前暂未发现这样修改后有什么问题,所以也不清楚RT官方是出于什么原因使用这样的实现方式,如果后期使用出现问题的时候可自行修改回原来的方式

  • 22
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
在Python中,我们可以使用百分号%f来格式化输出浮点数。百分号%f后面可以跟着一个小数点和一个数字,表示保留的小数位数。例如,如果我们想要保留2位小数,可以使用"%.2f"的格式。 示例代码如下: ``` num = 3.1415926 print("保留两位小数:%0.2f" % num) ``` 输出结果为: ``` 保留两位小数:3.14 ``` 另外,我们也可以使用format函数格式化输出浮点数。通过在大括号中使用冒号来指定格式,其中冒号后面的部分表示浮点数的格式。 示例代码如下: ``` num = 3.1415926 print("保留两位小数:{:.2f}".format(num)) ``` 输出结果为: ``` 保留两位小数:3.14 ``` 最后,我们还可以使用f-string来格式化输出浮点数。在f-string中,可以直接在大括号中使用冒号来指定格式。 示例代码如下: ``` num = 3.1415926 print(f"保留两位小数:{num:.2f}") ``` 输出结果为: ``` 保留两位小数:3.14 ``` 综上所述,我们可以使用百分号%f、format函数和f-string来实现Python中的浮点数格式化输出。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [技巧 | 5000字超全解析Python三种格式化输出方式【% / format / f-string】](https://blog.csdn.net/weixin_42152811/article/details/115264013)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [从零开始学Python编程之格式化输出](https://blog.csdn.net/m0_46388260/article/details/129568763)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值