制作一个数组来保存字符数组的数组用C(Making an Array to Hold Arrays

2019-08-31 12:38发布

我的C比目前生锈的多一点,所以我没有创造的东西,我认为应该是非常基本的。

请允许我引用字符数组作为这篇文章的字符串。 这将使事情都为我和你清晰。

我有什么是可以容纳1个或多个字符串数组。 例如{ “AB”, “CD”, “EF”}。 我不想再拍数组来存储字符串数组的多个版本。 因此,像{{ “AB”, “CD”, “EF”},{ “GH”, “IJ”},{ “KL”}}。

我有现在的问题是:

char *arrayOfStrings[50]; // a single array to hold multiple strings
char **arrayOfArraysOfStrings[10]; // array to hold multiple snapshots of arrayOfStrings

的字符串数组随时间变化而我使用基本保持arrayOfStrings的历史快照的字符串数组的数组。 当我需要访问数据快照阵列我的问题就来了。 这是我必须把东西到快照数组的代码:

arrayOfArraysOfStrings[input_index] = arrayOfStrings; // you can assume input_index is updated correctly, I've already checked that.

这似乎是不正确的,因为当我尝试访问并打印出快照数组的内容,只打印出从最近arrayOfStrings的信息。 我打算用这个想法是让他们放置arrayOfChars在快照阵列的条目指向,所以我以后可以访问它的地址。

眼下,对快照的访问数组中的一个条目来完成这样的:

arrayOfArraysOfChars[historicalIndex][indexOfTargetChar]

还有我期待回答几个问题:

  1. 是我介绍的方法适用于什么,我试图做的还是有我的总体逻辑缺陷?
  2. 什么是我错了我当前的代码做什么,我该如何解决?
  3. 有没有更好的方式来做到这一点,如果是的话,请问阵列的初始化,除了阵列,从阵列读取工作?

--edit 4 / 18--这个问题的部分原因是我设置的指针在arrayOfArraysOfStrings为指向arrayOfStrings指向同样的事情。 既然arrayOfStrings被编辑过不好。 我需要一些方法简单地分配一个新的内存块arrayOfStrings在指向复制一个二维数组......最好。

Answer 1:

你有你的两个阵列中的一个太很多三分球。

char arrayOfChars[50]; // a single array of characters
char *arrayOfArraysOfChars[10]; // array to hold multiple single arrays of characters

由于正在使用像一个缓冲的arrayOfChars(新数据总是去那里第一),你需要的字符串的副本保存到arrayOfArrays。 POSIX的功能strdup应该帮助这里。

公告&*是对立的,所以&**&什么都不做。

你也可以,从字面上是使arrayOfArrays。

char arrayOfChars[50]; // a single array of characters
char arrayOfArraysOfChars[10][50]; // array to hold multiple single arrays of characters

有了这个设置,你应该使用strcpy将数据复制到arrayOfArrays。


看了你的编辑,我认为你需要开始真正的简单。 而FWIW变量名是一种错误的匈牙利的。

对于什么,我认为你正在试图做的,我只是一个单一的字符数组开始。 这将是主要的缓冲 ,来保存正在输入并检查字符串。

enum { BUFSZ = 50 };
char buf[BUFSZ + 1];

然后你可以用用它fgets或什么的。

fgets(buf, BUFSZ, infile);

要在阵列保存这些了,我会使用strdup其自动剪线。 如果字符串都将是主要2个字符长,我不想被用于每一个48个额外的字节。 所以,字符指针(串)的阵列。

enum { STRVSZ = 40 };
char *strv[STRVSZ + 1];
int i;
i = 0;
strv[i] = strdup(buf);
strv[i+1] = NULL; // This makes it an "argv-style" NULL-terminated array of strings
++i; // i is now the index of the next element, and a count of elements already added

的每个元素strv是一个字符指针。 但是,为了明哲保身,我们试图抽象掉的是分散注意力的细节部分了一会儿,并把字符串作为一个单独的数据类型。

我们创造的这些名单,我们再次做同样的事情。 但是,没有任何strdup型功能,使指针数组的副本,所以我们必须要分开的分配和复制。

enum { STRVVSZ = 20 };
char **strvv[STRVVSZ + 1];
int j;
j = 0;
strvv[j] = calloc(i+1, sizeof *strvv[j]); // assuming i is the count of elements 
memcpy(strvv[j], strv, i * sizeof *strvv[j]);
++j; // j is now the index of the next string-pointer array in the array-of-same,
     // and a count of elements already added.

现在,我的名字只是和你的一样傻,但他们更短!



Answer 2:

你应该学会一个数组的意思。 阵列基本上是一组整数字符任何的。 当你在阵列中存储的字符值,其定义为,

char array[] = {"somestringhere"};

现在你想这样的阵列存储在另一个数组。 很简单:

char* array1[];

的数组1将存储值,它是的char*类型,即字符数组的地址。 现在要将这些存储在其他数组,

char** array2[];

这就是,[阵列地址]数组现在,你需要做的是;

array1[0] = array; //same as: array1[0] = *array[0];
array2[0] = *array1[0];

现在你所需要的一切。 希望大家都清楚,到核心。 :)



Answer 3:

这个例子用的Turbo C + 1.01 DOS完成,在3.0 DOS版本也适用。

char * text[] = {
  "message1",
  "message2",
  "message3"
};


Answer 4:

请注意,您的例子显示指针数组。 如果你想阵列(多维数组)的数组指定数组定义所有的大小。

char sentences[500][42]; /* sentences is an array of 500 elements.
                         ** each element is itself an array
                         ** capable of holding strings up to length 41 */


Answer 5:

如果存储文本在.C或具有文本的多行,相当于焦炭数组的数组的想法h文件。 可以这样做:

char * text[] = {
  "message1",
  "message2",
  "message3"
};

还可以使用字符*文本[],焦炭近*文本[],焦炭远*文本[],焦炭巨大的*文本[]。 必须有一个指针星号或明星人物。

for循环一个可以被用来显示文本:

char i; // int type can also be used
for (i = 0, i < 3; i++)
  printf("%s\n", text[i]);

其他循环:

char i = 0;  // may not be zero when declared as "char i;" only
while (i < 3) {
  printf("%s\n", text[i]);
  i++;
 }

要么

char i = 0;  // may not be zero when declared as "char i;" only
do {
 printf("%s\n", text[i]);
 i++;
} while (i < 3);


文章来源: Making an Array to Hold Arrays of Character Arrays in C