结构体转化成字符数组

昨天晚上在解决通过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);


切记切记!

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值