制作一个数组来保存C中的字符数组

我的C现在不仅仅是生锈,所以我没有创造出我认为应该非常基本的东西。

允许我将字符数组称为此post的字符串。 它会让我和你都清楚。

我所拥有的是一个可以容纳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被编辑,这很糟糕。 我需要一些方法来复制2D数组…最好只需为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变量名称是匈牙利语的错误类型。

对于我认为你想要做的事情,我只从一个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每个元素都是一个char指针。 但为了保持我们的理智,我们暂时试图将一些令人分心的细节抽象出来 ,并将字符串视为一种单独的数据类型。

现在要创建这些列表,我们再次做同样的事情。 但是没有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. 

现在,我的名字和你的名字一样愚蠢,但它们更短!

你应该学习一个数组意味着什么。 数组基本上是一组整数字符任何东西 。 当您在数组中存储字符值时,将其定义为,

 char array[] = {"somestringhere"}; 

现在要将这些数组存储在另一个数组中。 很简单:

 char* array1[]; 

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

 char** array2[]; 

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

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

现在你拥有了所需的一切。 希望你是明确的,核心的。 🙂

此示例使用turbo c + 1.01 dos完成,并且也在3.0 dos版本中工作。

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

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

 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 */ 

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

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

也可以使用char * text [],char附近* 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);