首页 > 编程语言 > 详细

【C语言】使用snprintf传递缓存信息时,需要注意的关键点

时间:2015-03-23 23:52:16      阅读:320      评论:0      收藏:0      [点我收藏+]

一、 snprintf函数说明


snprintf的函数定义为:int snprintf(char *str, size_t size, const char *format, ...);

函数为格式化的转换函数,并且以`\0`, 作为结束符

但是,如果不注意 的话,就会产生莫名其妙的结果,并且当代码比较多的时候,定位也比较麻烦,

所以,这里有必要说明。


二、 snprintf的错误使用


不多说, 直接贴代码,并且输出结果

<span style="font-size:12px;">#include <stdio.h>
#include <string.h>

typedef struct _T_TEST
{
	int a;
	int b;
}T_TEST, *PT_TEST;

int main(void)
{
	T_TEST tTest;
	memset(&tTest, 0, sizeof(tTest));
	tTest.a = 1;
	tTest.b = 2;
	printf("tTest.a = %d, tTest.b = %d.\n", tTest.a, tTest.b);
	
	char buf[128] = {0};
	snprintf(buf, sizeof(buf), "%s", (char *)&tTest);  // 这里将结构体拷贝到buf中
	PT_TEST ptTest = (PT_TEST)buf;
	printf("ptTest->a = %d, ptTest->b = %d.\n", ptTest->a, ptTest->b);

	return 0;
}

运行结果:
[root@f8s function_test]# ./snprintf_test                           
tTest.a = 1, tTest.b = 2.
ptTest->a = 1, ptTest->b = 0.   // 看这里, 整形b变为0
[root@f8s function_test]# </span>

问题的原因是:由于snprintf是以`\0‘为结束符,所以当进行字符拷贝的时候, 结构体T_TEST中间有结束符,所以,就被截断了。


三、 解决办法


使用memcpy函数,代替snprintf。

<span style="font-size:12px;">#include <stdio.h>
#include <string.h>

typedef struct _T_TEST
{
	int a;
	int b;
}T_TEST, *PT_TEST;

int main(void)
{
	T_TEST tTest;
	memset(&tTest, 0, sizeof(tTest));
	tTest.a = 1;
	tTest.b = 2;
	printf("tTest.a = %d, tTest.b = %d.\n", tTest.a, tTest.b);
	
	char buf[128] = {0};
	//snprintf(buf, sizeof(buf), "%s", (char *)&tTest);
	memcpy(buf, (char *)&tTest, sizeof(buf));
	PT_TEST ptTest = (PT_TEST)buf;
	printf("ptTest->a = %d, ptTest->b = %d.\n", ptTest->a, ptTest->b);

	return 0;
}

运行结果:
[root@f8s function_test]# ./memcpy_test
tTest.a = 1, tTest.b = 2.
ptTest->a = 1, ptTest->b = 2.
[root@f8s function_test]# </span>




【C语言】使用snprintf传递缓存信息时,需要注意的关键点

原文:http://blog.csdn.net/realizelizijun2013/article/details/44573075

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!