[英]Storing strings in a char array
我有一個數組uint8_t arr[512]
,我需要在此數組中存儲字符串,IP地址和32位數字。 所以我想到了如下定義另一個字符串數組。
uint8_t *ch[] = {
"abcd",
"1.1.1.1",
"123456782341223344445"
};
然后對arr[512]
進行一次memcpy
。 這個可以嗎? 我想我可能無法從arr
檢索IP地址。 還有其他想法。 謝謝你的時間。
如果您考慮將指針數組存儲在內存中的方式,您將理解為什么無法做到這一點。
您的字符串數組如下所示:
+-------+-------+-------+ | ch[0] | ch[1] | ch[2] | +-------+-------+-------+ | | | | | v | | "abcd" | v | "1.1.1.1" v "123456782341223344445"
因此,如果從ch
數組執行memcpy
,則僅復制指針 ,而不復制實際的字符串。
當然,您可以將數組中的每個字符串分別復制到目標數組中,但是這樣做與分隔和不相關的字符串沒有什么不同。
我認為這不是一個好主意。 更好地使用結構。
struct info
{
char* name;
char* address;
char* number; // or other type
}
如果要將完整的結構復制到陣列,可以使用pragma pack
。 或使用諸如復制之類的東西來組合它們。
如果要將其復制到靜態數組,則需要檢查名稱長度。
你可以這樣做,如果你memcpy()
的字符串ch[0]
到ch[2]
包括i將終止\\0
。 您不能僅僅memcpy()
完整的數組ch
。 要從arr
檢索第二個字符串,可以使用strlen()
或memchr()
:
char *ip = arr + strlen(arr) + 1;
要么
char *ip = memchr( arr, '\0', sizeof( arr ) ) + 1;
就我個人而言,我更喜歡第一個選項,因為通過adpopt獲得第三個字符串更容易。
請注意, uint8_t arr[512]
與uint8_t *ch[]
的類型不同。 第一個是512個字節的數組。 第二個是指向字節的指針數組。 您可能有嚴重的問題。 因此,請幫助我們並告訴我們您真正想要做什么。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.