结构体转化成字符数组

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


切记切记!

    原文作者:wonxxx
    原文地址: https://blog.csdn.net/wonxxx/article/details/39003575
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞