snprintf的函数定义为:int snprintf(char *str, size_t size, const char *format, ...);
函数为格式化的转换函数,并且以`\0`, 作为结束符
但是,如果不注意 的话,就会产生莫名其妙的结果,并且当代码比较多的时候,定位也比较麻烦,
所以,这里有必要说明。
不多说, 直接贴代码,并且输出结果
<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