我的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]
还有我期待回答几个问题:
- 是我介绍的方法适用于什么,我试图做的还是有我的总体逻辑缺陷?
- 什么是我错了我当前的代码做什么,我该如何解决?
- 有没有更好的方式来做到这一点,如果是的话,请问阵列的初始化,除了阵列,从阵列读取工作?
--edit 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个额外的字节。 所以,字符指针(串)的阵列。
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.
现在,我的名字只是和你的一样傻,但他们更短!
你应该学会一个数组的意思。 阵列基本上是一组整数或字符或任何的。 当你在阵列中存储的字符值,其定义为,
char array[] = {"somestringhere"};
现在你想这样的阵列存储在另一个数组。 很简单:
char* array1[];
的数组1将存储值,它是的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 * text[] = {
"message1",
"message2",
"message3"
};
还可以使用字符*文本[],焦炭近*文本[],焦炭远*文本[],焦炭巨大的*文本[]。 必须有一个指针星号或明星人物。
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);