14

我的 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 分配一个新的内存块来指向。

4

5 回答 5

19

您的两个数组中都有一个太多的指针。

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 变量名是错误的匈牙利语。

对于我认为您正在尝试做的事情,我将从一个 char 数组开始。这将是主缓冲区,用于保存正在输入和检查的字符串。

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

然后你可以使用它fgets或其他任何东西。

fgets(buf, BUFSZ, infile);

要将它们保存在一个数组中,我会使用strdup它的自动修剪。如果字符串的长度主要为 2 个字符,我不希望每个字符使用 48 个额外字节。因此,一个 char 指针(字符串)数组。

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-type 函数可以复制指针数组,因此我们必须将分配和复制分开。

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.

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

于 2013-04-18T20:09:10.300 回答
6

您应该了解数组的含义。数组基本上是一组整数字符任何东西。当您将字符值存储在数组中时,将其定义为,

char array[] = {"somestringhere"};

现在您想将此类数组存储在另一个数组中。很简单:

char* array1[];

array1 将存储char*类型的值,即字符数组的地址。现在你想将这些存储在其他数组中,

char** array2[];

这就是 [address of arrays] 现在的数组,您所要做的就是;

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

现在您拥有所需的一切。希望你清楚,核心。:)

于 2013-04-18T20:25:51.707 回答
5

这个例子是用 turbo c+ 1.01 dos 完成的,也适用于 3.0 dos 版本。

char * text[] = {
  "message1",
  "message2",
  "message3"
};
于 2014-10-06T20:23:34.637 回答
3

请注意,您的示例显示了指针数组。如果您想要数组的数组(多维数组),请在数组定义中指定所有大小。

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 */
于 2013-04-18T20:28:55.363 回答
1

如果将文本存储在具有多行文本的 .c 或 .h 文件中,则相当于 char 数组数组的想法。可以这样做:

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

还可以使用 char *text[]、char near *text[]、char far *text[]、char huge *text[]。指针必须有星号或星号。

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);
于 2014-09-16T02:15:24.807 回答