自定义函数获取buf时snprintf中sizeof(buf)出现问题导致赋值不全

本文主要是介绍自定义函数获取buf时snprintf中sizeof(buf)出现问题导致赋值不全,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

警告可能出现的问题:
directive output truncated writing 16 bytes into a region of size 4 [-Wformat-truncation=]

warning: argument to ‘sizeof’ in ‘snprintf’ call is the same expression as the destination; did you mean to provide an explicit length? [-Wsizeof-pointer-memaccess]

note: assuming directive output of 4 bytes


出现了问题记录一下,防止脑子不好忘记了。
直接上代码看情况:
在main函数中调用了report_tempRH_json,传入buf,获取数据。但是获取的数据是不全的。

#include <stdio.h>void report_tempRH_json(char *buf);int main(int argc, char *argv[])
{char temp_hum_buf[256];report_tempRH_json(temp_hum_buf);printf("temp_hum_buf:%s\n", temp_hum_buf);return 0;}void report_tempRH_json(char *buf)
{float temperature = 66.6666;float humidity = 55.5555;snprintf(buf, sizeof(buf), "{\"Temperature\":\"%.2f\", \"Humidity\":\"%.2f\"}", temperature, humidity);printf("buf:%s\n", buf);
}

在这里插入图片描述


找了一圈没找到答案,最后发现,sizeof(buf)这儿出现了问题:
在main主函数中sizeof(buf)=256
在自定义函数中sizeof(buf)=8
所以字节在自定义函数中将sizeof(buf)改成256就可,或者宏定义大小,比较方便。

#include <stdio.h>void report_tempRH_json(char *buf);int main(int argc, char *argv[])
{char temp_hum_buf[256];report_tempRH_json(temp_hum_buf);printf("Main function sizeof(temp_hum_buf): %d\n", sizeof(temp_hum_buf));printf("temp_hum_buf:%s\n", temp_hum_buf);return 0;}void report_tempRH_json(char *buf)
{float temperature = 66.6666;float humidity = 55.5555;snprintf(buf, 256, "{\"Temperature\":\"%.2f\", \"Humidity\":\"%.2f\"}", temperature, humidity);printf("Custom function sizeof(buf): %s\n", buf);printf("sizeof(buf): %d\n", sizeof(buf));
}

在这里插入图片描述


但是在实际情况下我们不会传buf的,一般是一个函数就实现一个功能,我们的目的是在buf中放数据,那就直接在自定义函数中进行就可以了呗。并且buf用完之后出了自定义函数之后就释放了,方便。

#include <stdio.h>void report_tempRH_json();int main(int argc, char *argv[])
{report_tempRH_json();return 0;}void report_tempRH_json()
{char  buf[256];float temperature = 66.6666;float humidity = 55.5555;snprintf(buf, sizeof(buf), "{\"Temperature\":\"%.2f\", \"Humidity\":\"%.2f\"}", temperature, humidity);printf("sizeof(buf): %s\n", buf);printf("sizeof(buf): %d\n", sizeof(buf));
}

在这里插入图片描述


这篇关于自定义函数获取buf时snprintf中sizeof(buf)出现问题导致赋值不全的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/215465

相关文章

Python函数作用域示例详解

《Python函数作用域示例详解》本文介绍了Python中的LEGB作用域规则,详细解析了变量查找的四个层级,通过具体代码示例,展示了各层级的变量访问规则和特性,对python函数作用域相关知识感兴趣... 目录一、LEGB 规则二、作用域实例2.1 局部作用域(Local)2.2 闭包作用域(Enclos

怎样通过分析GC日志来定位Java进程的内存问题

《怎样通过分析GC日志来定位Java进程的内存问题》:本文主要介绍怎样通过分析GC日志来定位Java进程的内存问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、GC 日志基础配置1. 启用详细 GC 日志2. 不同收集器的日志格式二、关键指标与分析维度1.

Java 线程安全与 volatile与单例模式问题及解决方案

《Java线程安全与volatile与单例模式问题及解决方案》文章主要讲解线程安全问题的五个成因(调度随机、变量修改、非原子操作、内存可见性、指令重排序)及解决方案,强调使用volatile关键字... 目录什么是线程安全线程安全问题的产生与解决方案线程的调度是随机的多个线程对同一个变量进行修改线程的修改操

MySQL count()聚合函数详解

《MySQLcount()聚合函数详解》MySQL中的COUNT()函数,它是SQL中最常用的聚合函数之一,用于计算表中符合特定条件的行数,本文给大家介绍MySQLcount()聚合函数,感兴趣的朋... 目录核心功能语法形式重要特性与行为如何选择使用哪种形式?总结深入剖析一下 mysql 中的 COUNT

Redis出现中文乱码的问题及解决

《Redis出现中文乱码的问题及解决》:本文主要介绍Redis出现中文乱码的问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 问题的产生2China编程. 问题的解决redihttp://www.chinasem.cns数据进制问题的解决中文乱码问题解决总结

MySQL 中 ROW_NUMBER() 函数最佳实践

《MySQL中ROW_NUMBER()函数最佳实践》MySQL中ROW_NUMBER()函数,作为窗口函数为每行分配唯一连续序号,区别于RANK()和DENSE_RANK(),特别适合分页、去重... 目录mysql 中 ROW_NUMBER() 函数详解一、基础语法二、核心特点三、典型应用场景1. 数据分

MySQL 获取字符串长度及注意事项

《MySQL获取字符串长度及注意事项》本文通过实例代码给大家介绍MySQL获取字符串长度及注意事项,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录mysql 获取字符串长度详解 核心长度函数对比⚠️ 六大关键注意事项1. 字符编码决定字节长度2

全面解析MySQL索引长度限制问题与解决方案

《全面解析MySQL索引长度限制问题与解决方案》MySQL对索引长度设限是为了保持高效的数据检索性能,这个限制不是MySQL的缺陷,而是数据库设计中的权衡结果,下面我们就来看看如何解决这一问题吧... 目录引言:为什么会有索引键长度问题?一、问题根源深度解析mysql索引长度限制原理实际场景示例二、五大解决

Springboot如何正确使用AOP问题

《Springboot如何正确使用AOP问题》:本文主要介绍Springboot如何正确使用AOP问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录​一、AOP概念二、切点表达式​execution表达式案例三、AOP通知四、springboot中使用AOP导出

MySQL数据库的内嵌函数和联合查询实例代码

《MySQL数据库的内嵌函数和联合查询实例代码》联合查询是一种将多个查询结果组合在一起的方法,通常使用UNION、UNIONALL、INTERSECT和EXCEPT关键字,下面:本文主要介绍MyS... 目录一.数据库的内嵌函数1.1聚合函数COUNT([DISTINCT] expr)SUM([DISTIN