将字符串存储在char数组中

时间:2013-07-22 10:50:52

标签: c arrays string c-strings

我有一个数组uint8_t arr[512],我需要在这个数组中存储一个字符串,IP地址和一个32位数字。所以我想要定义另一个字符串数组,如下所示。

uint8_t *ch[] = {
     "abcd",
     "1.1.1.1",
     "123456782341223344445"
};

然后memcpy进入arr[512]。这个可以吗?我想我可能无法从arr检索IP地址。请其他任何想法。谢谢你的时间。

4 个答案:

答案 0 :(得分:4)

如果你想一下如何将一个指针数组存储在内存中,你就会明白为什么不能这样做。

您的字符串数组如下所示:

+-------+-------+-------+
| ch[0] | ch[1] | ch[2] |
+-------+-------+-------+
   |       |       |
   |       |       v
   |       |       "abcd"
   |       v
   |       "1.1.1.1"
   v
   "123456782341223344445"

因此,如果您从memcpy数组中执行ch,则只复制指针,而不是实际的字符串。


当然,你可以将数组中的每个字符串分别复制到目标数组中,但是它与分离和不相关的字符串没什么不同。

答案 1 :(得分:2)

我认为这不是一个好主意。更好地使用结构。

struct info
{
  char* name;
  char* address;
  char* number; // or other type
}

如果要将完整结构复制到数组,可以使用pragma pack。或者使用类似复制的东西来组合它们。

如果要将其复制到静态数组,则需要检查名称长度。

答案 2 :(得分:0)

如果memcpy()字符串为ch[0]ch[2],您可以这样做,包括终止\0。您不能只memcpy()完整数组ch。要从arr中检索第二个字符串,您可以使用strlen()memchr()

char *ip = arr + strlen(arr) + 1;

char *ip = memchr( arr, '\0', sizeof( arr ) ) + 1;

就我个人而言,我会优先考虑第一个选项,因为更容易通过adpopt获得第三个字符串。

答案 3 :(得分:0)

请注意uint8_t arr[512]uint8_t *ch[]的类型不同。 第一个是512字节的数组。 第二个是指向字节的指针数组。 你可能有严重的问题。所以,请告诉我们你真正想做的事情。