昨天晚上在解决通过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"。
成功!
---------------------------------------------------------------------------------------------------------------------------------------------------------------
刚刚又犯了同样的错误!在socket的发送函数中又使用了strlen:
send(socket, buf, strlen(buf), 0);
导致只发送了结构体的第一个变量!正确的做法应该是:
send(socket, buf, sizeof(buf), 0);
切记切记!