我的 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]
我想回答几个问题:
- 我概述的方法是否适合我正在尝试做的事情,或者我的整体逻辑是否存在缺陷?
- 我当前的代码有什么问题,我该如何解决?
- 有没有更好的方法来做到这一点?如果有,数组的初始化、数组的添加和数组的读取是如何工作的?
--编辑 4/18-- 部分问题是我在 arrayOfArraysOfStrings 中设置指针以指向 arrayOfStrings 所指向的同一事物。这很糟糕,因为 arrayOfStrings 被编辑了。我需要一些方法来复制二维数组...最好是通过简单地为 arrayOfStrings 分配一个新的内存块来指向。
最佳答案
你的两个数组中的指针太多了。
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 个额外的字节。因此,一个 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
类型的函数来复制指针数组,因此我们必须将分配和复制分开。
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.
现在,我的名字和你的一样傻,但它们更短!
关于c - 在 C 中创建一个数组来保存字符数组的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16091848/