昨天晚上在解决通过socket发送结构体的问题的时候,知道了可以将结构体先转化成字符串的形式再发送,但今天之前一直有个疑问没有解决(为了方便描述,去掉socket部分),首先看下代码:
#include <stdlib.h> #include <stdio.h> #include <string.h> typedef struct info { char name[5]; char num[10]; }INFO; int main() { INFO info; char buf[15]; strcpy(info.name, "won"); strcpy(info.num, "12345"); memcpy(buf, &info, sizeof(info)); printf("%s\n", buf); printf("%d\n", (int)strlen(buf)); exit(0); }
编译运行之后,发现只打印了第一个变量的值“won”,而“12345”没有打印出来。而且buf的长度是3而不是8。这是为什么呢?难道结构体转化成字符串时候没有完全转化?
今天早上突然想起,printf()函数和strlen()都是遇到结束符就返回的!!!其实buf数组里的内容是“won\012345\0”。所以只能打印出“won”。
为了证实这一想法,可以将打印语句换成:
int i = 0; while(i < 15) { printf("%c", buf[i]); i++; } printf("\n");
编译运行后打印"won12345"。
还有一个更好的办法,就是再将字符串转化成对应的结构体(这才是最终目的啊),下面是代码:
#include <stdlib.h> #include <stdio.h> #include <string.h> typedef struct info { char name[5]; char num[10]; }INFO; int main() { INFO info, info1; char buf[15]; strcpy(info.name, "won"); strcpy(info.num, "12345"); memcpy(buf, &info, sizeof(info)); memcpy(&info1, buf, sizeof(buf)); printf("%s,%s\n", info1.name, info1.num); exit(0); }
通过memcpy(&info1, buf, sizeof(info)); 将字符数组buf的内容转化成结构体info1,编译运行后的结果是:"won,12345"。
成功!
时间: 2024-10-07 11:04:07