如何在运行时以C语言存储多个字符串数组?
我在运行时创建了多个字符串数组,并且知道需要存储的数组的数量 我想存储它们或指向它们。我不知道该怎么做,也不知道语法,也找不到教程。我相信这可以通过struct或char**[]实现 我基本上想要这种行为,除了在运行时之前不创建字符串数组如何在运行时以C语言存储多个字符串数组?,c,arrays,string,syntax,C,Arrays,String,Syntax,我在运行时创建了多个字符串数组,并且知道需要存储的数组的数量 我想存储它们或指向它们。我不知道该怎么做,也不知道语法,也找不到教程。我相信这可以通过struct或char**[]实现 我基本上想要这种行为,除了在运行时之前不创建字符串数组 struct arrayholder{ const char **argv; }; char *str_arr1[] = { "sdfddsf", "foo1", 0 }; char *str_arr2[] = { "sdsosdfrt
struct arrayholder{
const char **argv;
};
char *str_arr1[] = { "sdfddsf", "foo1", 0 };
char *str_arr2[] = { "sdsosdfrt", "foo2", 0 };
char *str_arr3[] = { "grsdsfdep", "foo3", 0 };
struct arrayholder the_arrays [] = { {str_arr1},{str_arr2},{str_arr3} };
// The contents should look like,
// the_arrays[0] ==> {str_arr1}
// the_arrays[0].argv[0] ==> "sdfddsf"
// the_arrays[0].argv[1] ==> "foo1"
您可以使用3D数组,如本例所示:
或者,您可以使用一个简单的链表,其中每个节点都是一个2D数组。在您知道数组数量的地方,您可以创建一个包含字符*的2D数组。或者更方便的是,指向这样一个数组的第一个元素的指针。第一个元素是
char*[n]
类型的数组,因此指向它的指针的类型是char*(*)[n]
。例如:
char* (*str_table)[y] = malloc(sizeof (char*[x][y]));
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <assert.h>
static char* random_string (void)
{
static char str[10+1];
size_t size = rand()%10 + 1;
size_t i;
for(i=0; i<size; i++)
{
str[i] = rand() % ('Z' - 'A' + 1) + 'A';
}
str[i] = '\0';
return str;
}
int main (void)
{
srand(time(NULL));
size_t x = 3;
size_t y = 2;
char* (*str_table)[y] = malloc(sizeof (char*[x][y]));
assert(str_table);
for(size_t i=0; i<x; i++)
{
for(size_t j=0; j<y; j++)
{
char* str = random_string();
size_t str_size = strlen(str)+1;
str_table[i][j] = malloc(str_size);
assert(str_table[i][j]);
strcpy(str_table[i][j], str);
printf("%s ", str_table[i][j]);
}
printf("\n");
}
free(str_table);
}
然后通过为每个项调用malloc来填充此二维数组。例如:
char* (*str_table)[y] = malloc(sizeof (char*[x][y]));
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <assert.h>
static char* random_string (void)
{
static char str[10+1];
size_t size = rand()%10 + 1;
size_t i;
for(i=0; i<size; i++)
{
str[i] = rand() % ('Z' - 'A' + 1) + 'A';
}
str[i] = '\0';
return str;
}
int main (void)
{
srand(time(NULL));
size_t x = 3;
size_t y = 2;
char* (*str_table)[y] = malloc(sizeof (char*[x][y]));
assert(str_table);
for(size_t i=0; i<x; i++)
{
for(size_t j=0; j<y; j++)
{
char* str = random_string();
size_t str_size = strlen(str)+1;
str_table[i][j] = malloc(str_size);
assert(str_table[i][j]);
strcpy(str_table[i][j], str);
printf("%s ", str_table[i][j]);
}
printf("\n");
}
free(str_table);
}
#包括
#包括
#包括
#包括
#包括
静态字符*随机字符串(无效)
{
静态字符str[10+1];
size\u t size=rand()%10+1;
尺寸i;
对于(i=0;i作为程序员,您需要决定如何存储数据。您有多种选择,请记住:
“string”是存储的以零字节结尾的数组字符,即。“\0”
您需要存储一个数组中有多少个数组元素
对于“字符串”,数组中的元素数/字符串中的字符数可以通过计算字符数来计算,直到遇到零字节“\0”
对于所有其他阵列,您有两个选项。
您显式地将最后一个数组成员设置为NULL/zero,就像您在str_arr1[]={“sdfddsf”,“foo1”,0};
中所做的那样。复制这样的数组时,您需要记住显式地将最后一个成员设置为零。在这种情况下,在计算大小时,您经常会在代码中看到一个神奇的+1
,如malloc(sizeof(char)*(strlen(字符串)+1))
您可以将数组大小存储在单独的变量中,通常为size\u t
类型
您有3个字符串数组,即3个数组以NULL结尾,数组以零字节字符结尾
您需要一个字符串数组。您需要决定如何跟踪该数组的大小以及内部数组的大小
我不喜欢有一个显式的数组终止值。我喜欢使用类型为size\u t
的单独变量存储数组的大小。通常我会将指向数组的指针和存储大小的变量包装在一个结构中。这样,我可以为数组的每个级别编写单独的库
请不要为char***var;
做决定。这会使代码不可读
实时版本可在。每次我们使用3级间接寻址时,一只可爱的小猫就会死去。请检查更好的替代方案。感谢您的解决方案,抱歉变得更复杂…但是对于这个示例,3d字符数组如何与不同长度的字符串数组一起工作?我的意思是这些维度-->3darray[][3][2]
表示具有“三个长度为2的字符串数组”的数组,但如果我们想要不同的数组长度,该怎么办?(…此维度-->[][3][DifferentLength]
对于每个维度都不同)是选择一个合理大小的唯一解决方案,该大小足以满足运行时确定的任何字符串数组长度?