【问题标题】:Storing strings in a char array将字符串存储在 char 数组中
【发布时间】:2013-07-22 10:50:52
【问题描述】:

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

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

然后在arr[512] 中输入memcpy。这个可以吗?我想我可能无法从arr 中检索 IP 地址。请有任何其他想法。感谢您的宝贵时间。

【问题讨论】:

  • ,查看Difference between char* str[] and char str[][] and how both stores in memory? 以了解*ch[] 是如何存储在内存中的,memcopy 需要source 继续内存,而它的 不是
  • 不相关:为什么是uint8_t* 而不是char*
  • 为什么不是struct,其中包含一个字符串、一个 32 位整数表示 IP 地址和第二个字符串表示 32 位数字?
  • @MyPasswordIsLasercats 你的意思是 struct 而不是 arr[512]ch[] 吗?你能详细说明一下吗?
  • @foo_l,能详细说明一下吗?根本不清楚你从什么开始以及你想要实现什么。

标签: c arrays string c-strings


【解决方案1】:

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

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

+-------+-------+--------+ |通道[0] |通道[1] |通道[2] | +-------+-------+--------+ | | | | | v | | “A B C D” | v | “1.1.1.1” v “123456782341223344445”

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


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

【讨论】:

  • 同意。但是如何将字符串和其他内容存储在arr[512] 中?
  • @foo_l 将它们一一复制到目标数组中,跟踪下一个字符串应该从哪里开始(strcpystrlen 在这里很好)。
  • @foo_l 要复制,您也可以使用:sprintf(arr, "%s %s %s", ch[0], ch[1], ch[2]); 一步。 (是的,但是 Joachim Pileborg 的建议更好如果您不知道要从 ch[] 复制的字符串数(“ip”)并且您将需要一个循环)
  • @GrijeshChauhan snprintf 是更好的选择,避免缓冲区溢出。
  • @JoachimPileborg 是的,我忘了和你分享tool,你的回答说你会喜欢的!! :)
【解决方案2】:

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

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

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

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

【讨论】:

  • 建议:使用 32Bit-Integer 作为地址
【解决方案3】:

如果您将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;

我个人更喜欢第一个选项,因为它更容易获得第三个字符串。

【讨论】:

    【解决方案4】:

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

    【讨论】:

    • 我只想将字符串和其他内容存储到arr[512]。所以当我尝试检索它们时a[0]必须是aa[1] = ba[2] = ca[3]=1a[4]=1a[5]=1a[6]=1a[7]=1等等......
    猜你喜欢
    • 2012-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-04
    • 1970-01-01
    • 2012-03-31
    • 2015-12-01
    相关资源
    最近更新 更多