1. 程式人生 > >結構體轉化成字元陣列

結構體轉化成字元陣列

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

切記切記!