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