結構體轉化成字符數組

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


切記切記!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章