c - 在 C 中创建一个数组来保存字符数组的数组

标签 c arrays character-arrays

我的 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. 有没有更好的方法来做到这一点?如果有,数组的初始化、数组的添加和数组的读取是如何工作的?

--编辑 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/

相关文章:

c - 取消引用多维数组名称和指针算法

c++ - C++获取一个字符串的所有后缀

c - 打印 UTF-16 字符串

javascript,依赖于排序2数组

c++ - 在 assembly 中找到平均值、最小值和最大值

java - 我的 findCombos 方法不起作用,如何从 java 字符数组中删除字符

c - 为什么 STM32 gcc 链接器脚本会自动丢弃这些标准库 : libc. a、libm.a、libgcc.a 中的所有输入节?

php - 基于所选复选框的 SELECT 查询

c++ - 通过赋值运算符返回字符数组

java - 如何在不使用和额外的特殊字符的情况下初始化 6*5 二维矩阵中的 26 个字符