簡體   English   中英

將字符串存儲在char數組中

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM