結構體轉化成字元陣列
阿新 • • 發佈:2018-12-30
昨天晚上在解決通過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"。
還有一個更好的辦法,就是再將字串轉化成對應的結構體(這才是最終目的啊),下面是程式碼:
通過memcpy(&info1, buf, sizeof(info)); 將字元陣列buf的內容轉化成結構體info1,編譯執行後的結果是:"won,12345"。#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); }
成功!
---------------------------------------------------------------------------------------------------------------------------------------------------------------
剛剛又犯了同樣的錯誤!在socket的傳送函式中又使用了strlen:
send(socket, buf, strlen(buf), 0);
導致只發送了結構體的第一個變數!正確的做法應該是:
send(socket, buf, sizeof(buf), 0);
切記切記!