制作一个数组来保存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]
我想回答几个问题:
- 我概述的方法是否适用于我正在尝试做的事情,或者我的整体逻辑中是否存在缺陷?
- 我目前的代码出了什么问题?如何解决?
- 有没有更好的方法来实现这一点,如果是这样,数组的初始化,数组的添加和数组的读取如何工作?
–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);