如何在运行时以C语言存储多个字符串数组?

如何在运行时以C语言存储多个字符串数组?,c,arrays,string,syntax,C,Arrays,String,Syntax,我在运行时创建了多个字符串数组,并且知道需要存储的数组的数量 我想存储它们或指向它们。我不知道该怎么做,也不知道语法,也找不到教程。我相信这可以通过struct或char**[]实现 我基本上想要这种行为,除了在运行时之前不创建字符串数组 struct arrayholder{ const char **argv; }; char *str_arr1[] = { "sdfddsf", "foo1", 0 }; char *str_arr2[] = { "sdsosdfrt

我在运行时创建了多个字符串数组,并且知道需要存储的数组的数量

我想存储它们或指向它们。我不知道该怎么做,也不知道语法,也找不到教程。我相信这可以通过struct或char**[]实现

我基本上想要这种行为,除了在运行时之前不创建字符串数组

  struct arrayholder{
   const char **argv;
  };

  char *str_arr1[] = { "sdfddsf", "foo1", 0 };
  char *str_arr2[] = { "sdsosdfrt", "foo2", 0 };
  char *str_arr3[] = { "grsdsfdep", "foo3", 0 };


  struct arrayholder the_arrays [] = { {str_arr1},{str_arr2},{str_arr3} };

//      The contents should look like,
//         the_arrays[0] ==> {str_arr1}
//         the_arrays[0].argv[0] ==> "sdfddsf"
//         the_arrays[0].argv[1] ==> "foo1"

您可以使用3D数组,如本例所示:


或者,您可以使用一个简单的链表,其中每个节点都是一个2D数组。

在您知道数组数量的地方,您可以创建一个包含字符*的2D数组。或者更方便的是,指向这样一个数组的第一个元素的指针。第一个元素是
char*[n]
类型的数组,因此指向它的指针的类型是
char*(*)[n]
。例如:

char* (*str_table)[y] = malloc(sizeof (char*[x][y]));
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <assert.h>

static char* random_string (void)
{
  static char str[10+1];
  size_t size = rand()%10 + 1;
  size_t i;

  for(i=0; i<size; i++)
  {
    str[i] = rand() % ('Z' - 'A' + 1) + 'A';
  }
  str[i] = '\0';
  return str;
}

int main (void)
{
  srand(time(NULL));

  size_t x = 3;
  size_t y = 2;

  char* (*str_table)[y] = malloc(sizeof (char*[x][y]));
  assert(str_table);

  for(size_t i=0; i<x; i++)
  {
    for(size_t j=0; j<y; j++)
    {
      char* str = random_string();
      size_t str_size = strlen(str)+1;
      str_table[i][j] = malloc(str_size);
      assert(str_table[i][j]);
      strcpy(str_table[i][j], str);

      printf("%s ", str_table[i][j]);
    }
    printf("\n");
  }


  free(str_table);
}
然后通过为每个项调用malloc来填充此二维数组。例如:

char* (*str_table)[y] = malloc(sizeof (char*[x][y]));
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <assert.h>

static char* random_string (void)
{
  static char str[10+1];
  size_t size = rand()%10 + 1;
  size_t i;

  for(i=0; i<size; i++)
  {
    str[i] = rand() % ('Z' - 'A' + 1) + 'A';
  }
  str[i] = '\0';
  return str;
}

int main (void)
{
  srand(time(NULL));

  size_t x = 3;
  size_t y = 2;

  char* (*str_table)[y] = malloc(sizeof (char*[x][y]));
  assert(str_table);

  for(size_t i=0; i<x; i++)
  {
    for(size_t j=0; j<y; j++)
    {
      char* str = random_string();
      size_t str_size = strlen(str)+1;
      str_table[i][j] = malloc(str_size);
      assert(str_table[i][j]);
      strcpy(str_table[i][j], str);

      printf("%s ", str_table[i][j]);
    }
    printf("\n");
  }


  free(str_table);
}
#包括
#包括
#包括
#包括
#包括
静态字符*随机字符串(无效)
{
静态字符str[10+1];
size\u t size=rand()%10+1;
尺寸i;

对于(i=0;i作为程序员,您需要决定如何存储数据。您有多种选择,请记住:

  • “string”是存储的以零字节结尾的数组字符,即。
    “\0”
  • 您需要存储一个数组中有多少个数组元素
  • 对于“字符串”,数组中的元素数/字符串中的字符数可以通过计算字符数来计算,直到遇到零字节“\0”
  • 对于所有其他阵列,您有两个选项。
  • 您显式地将最后一个数组成员设置为NULL/zero,就像您在
    str_arr1[]={“sdfddsf”,“foo1”,0};
    中所做的那样。复制这样的数组时,您需要记住显式地将最后一个成员设置为零。在这种情况下,在计算大小时,您经常会在代码中看到一个神奇的
    +1
    ,如
    malloc(sizeof(char)*(strlen(字符串)+1))
  • 您可以将数组大小存储在单独的变量中,通常为
    size\u t
    类型
  • 您有3个字符串数组,即3个数组以NULL结尾,数组以零字节字符结尾
  • 您需要一个字符串数组。您需要决定如何跟踪该数组的大小以及内部数组的大小
  • 我不喜欢有一个显式的数组终止值。我喜欢使用类型为
    size\u t
    的单独变量存储数组的大小。通常我会将指向数组的指针和存储大小的变量包装在一个结构中。这样,我可以为数组的每个级别编写单独的库
  • 请不要为
    char***var;
    做决定。这会使代码不可读

  • 实时版本可在。

    每次我们使用3级间接寻址时,一只可爱的小猫就会死去。请检查更好的替代方案。感谢您的解决方案,抱歉变得更复杂…但是对于这个示例,3d字符数组如何与不同长度的字符串数组一起工作?我的意思是这些维度-->
    3darray[][3][2]
    表示具有“三个长度为2的字符串数组”的数组,但如果我们想要不同的数组长度,该怎么办?(…此维度-->
    [][3][DifferentLength]
    对于每个维度都不同)是选择一个合理大小的唯一解决方案,该大小足以满足运行时确定的任何字符串数组长度?