Dae*_*314 15 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
Run Code Online (Sandbox Code Playgroud)
字符串数组随着时间的推移而变化,我使用字符串数组数组来基本保存arrayOfStrings的历史快照.当我需要访问数据的快照数组时,我的问题出现了.这是我必须将内容放入快照数组的代码:
arrayOfArraysOfStrings[input_index] = arrayOfStrings; // you can assume input_index is updated correctly, I've already checked that.
Run Code Online (Sandbox Code Playgroud)
这似乎是不正确的,因为当我尝试访问并打印出快照数组的内容时,它只打印出来自最新的arrayOfStrings的信息.我想要的想法是将arrayOfChars所指向的地址存储在快照数组的一个条目中,以便我以后可以访问它.
现在,访问快照数组中的条目是这样完成的:
arrayOfArraysOfChars[historicalIndex][indexOfTargetChar]
Run Code Online (Sandbox Code Playgroud)
我想回答几个问题:
--edit 4/18--部分问题在于我在arrayOfArraysOfStrings中设置指针指向arrayOfStrings指向的相同内容.这是糟糕的,因为arrayOfStrings被编辑.我需要一些方法来复制2D数组...最好是通过简单地为arrayOfStrings分配一个新的内存块来指向.
lus*_*oog 17
你的两个数组都有一个太多的指针.
char arrayOfChars[50]; // a single array of characters
char *arrayOfArraysOfChars[10]; // array to hold multiple single arrays of characters
Run Code Online (Sandbox Code Playgroud)
由于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
Run Code Online (Sandbox Code Playgroud)
使用此设置,您应该使用strcpy将数据复制到arrayOfArrays中.
阅读完你的编辑后,我认为你需要开始真正的简单.而FWIW变量名是匈牙利语的错误类型.
对于我认为你想要做的事情,我只从一个char数组开始.这将是主缓冲区,用于保存正在输入和检查的字符串.
enum { BUFSZ = 50 };
char buf[BUFSZ + 1];
Run Code Online (Sandbox Code Playgroud)
然后你可以用它fgets或其他什么.
fgets(buf, BUFSZ, infile);
Run Code Online (Sandbox Code Playgroud)
为了将它们保存在阵列中,我将使用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
Run Code Online (Sandbox Code Playgroud)
每个元素strv都是一个char指针.但为了保持我们的理智,我们暂时试图将一些令人分心的细节抽象出来,并将字符串视为一种单独的数据类型.
现在要创建这些列表,我们再次做同样的事情.但是没有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.
Run Code Online (Sandbox Code Playgroud)
现在,我的名字和你的名字一样愚蠢,但它们更短!
小智 6
你应该了解一个数组意味着什么.数组基本上是一组整数或字符或任何东西.当您在数组中存储字符值时,将其定义为,
char array[] = {"somestringhere"};
Run Code Online (Sandbox Code Playgroud)
现在要将这些数组存储在另一个数组中.很简单:
char* array1[];
Run Code Online (Sandbox Code Playgroud)
array1将存储值,char*类型是字符数组的地址.现在你想将它们存储在其他数组中,
char** array2[];
Run Code Online (Sandbox Code Playgroud)
这就是现在的[数组地址]数组,你所要做的就是;
array1[0] = array; //same as: array1[0] = *array[0];
array2[0] = *array1[0];
Run Code Online (Sandbox Code Playgroud)
现在你已经拥有了所需的一切.希望你是明确的,核心的.:)
小智 5
这个例子是用turbo c+ 1.01 dos完成的,也可以在3.0 dos版本中运行。
char * text[] = {
"message1",
"message2",
"message3"
};
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
59856 次 |
| 最近记录: |