C多维字符数组初始化

C多维字符数组初始化,c,multidimensional-array,C,Multidimensional Array,我是C语言的新手,我正试着把注意力集中在多维字符数组的初始化上,对于我的任务,我被要求从文件中读取文本并将其存储在数组中 我必须读取5个虚构人物的输入并存储他们的一些信息,因此我意识到我的数组将类似于: char input[5][]; 我所困惑的是第二个参数,我也不确定该设置什么。关于这些人,我将存储9个字段的信息,我似乎找不到答案,我是否应该将第二个数字设置为字段的数量,或者它应该有多大。即 char input[5][9]; 或 另外,如果是后者,是否有一种做法,我应该将其设置为多大,

我是C语言的新手,我正试着把注意力集中在多维字符数组的初始化上,对于我的任务,我被要求从文件中读取文本并将其存储在数组中

我必须读取5个虚构人物的输入并存储他们的一些信息,因此我意识到我的数组将类似于:

char input[5][];
我所困惑的是第二个参数,我也不确定该设置什么。关于这些人,我将存储9个字段的信息,我似乎找不到答案,我是否应该将第二个数字设置为字段的数量,或者它应该有多大。即

char input[5][9];


另外,如果是后者,是否有一种做法,我应该将其设置为多大,或者只选择一个数字?谢谢

我建议您采取以下方法:不要创建一个
char
数组来存储这些人的信息,而应该创建一个
struct
person,其中包含一些具有预定义长度的信息变量

struct person {
    char name[50];
    char address[50];
    char phone_number[15];
};
或者,如果您愿意,您可以创建这些字符指针(例如
char*name
char*address
),然后您可以根据需要为每个变量分配所需的内存量(另外,使用后不要忘了分配内存)

然后,在main中,您可以创建一个person数组,例如
struct person[5],并根据需要对其进行操作


编辑:还要注意,正如Pankrates所评论的,当您为数组定义大小时,必须确保输入不会超过数组的长度,否则您将在内存中写入不属于您的内容,这就导致了。

我建议您采取以下方法:不要用
char
数组来存储这些人的信息,而应该创建一个
struct
person,它将具有一些预定义长度的信息变量

struct person {
    char name[50];
    char address[50];
    char phone_number[15];
};
或者,如果您愿意,您可以创建这些字符指针(例如
char*name
char*address
),然后您可以根据需要为每个变量分配所需的内存量(另外,使用后不要忘了分配内存)

然后,在main中,您可以创建一个person数组,例如
struct person[5],并根据需要对其进行操作


编辑:还要注意,正如Pankrates所评论的,当您为数组定义一个大小时,您必须确保输入不会超过数组的长度,否则您将在内存中写入不属于您的内容,这将导致。

要理解这一点,您应该尝试了解输入。如果您完全确定5个人只有9个字段(单字符数据),那么您应该将其设置为
char input[5][9]

如果您认为将来可能会有比9更多的信息字段,那么可以选择更高的值,如
char input[5][256]
。但是,如果字段的数据稀疏,这将浪费大量空间。这是内存的静态分配

因此,当您不确定每个人的字段数量时,第三种选择是动态分配内存,如--

在最后一种情况中,内存是在运行时而不是编译时提供的。您还可以从用户输入中获取大小,并将其用于为字段分配内存

char* input[5];
int size = 0;
scanf("%d",&size);
input[0] = malloc(sizeof(char) * size);
此外,如果您需要存储字段,其中每个字段包含多个字符,那么您应该创建一个结构

struct person
{  char name[30];   // memory could be assigned dynamically or statically
   char field1[30];
   char field2[30];
   ...
};

要了解这一点,您应该尝试了解输入。如果您完全确定5个人只有9个字段(单字符数据),那么您应该将其设置为
char input[5][9]

如果您认为将来可能会有比9更多的信息字段,那么可以选择更高的值,如
char input[5][256]
。但是,如果字段的数据稀疏,这将浪费大量空间。这是内存的静态分配

因此,当您不确定每个人的字段数量时,第三种选择是动态分配内存,如--

在最后一种情况中,内存是在运行时而不是编译时提供的。您还可以从用户输入中获取大小,并将其用于为字段分配内存

char* input[5];
int size = 0;
scanf("%d",&size);
input[0] = malloc(sizeof(char) * size);
此外,如果您需要存储字段,其中每个字段包含多个字符,那么您应该创建一个结构

struct person
{  char name[30];   // memory could be assigned dynamically or statically
   char field1[30];
   char field2[30];
   ...
};

请注意,使用这些方法时,您应该始终确保用户输入将适合分配的内存,即在第一种情况下,在
person.name
中输入超过49个字符的名称将导致未定义behaviour@Pankrates很好,谢谢。我忘了将其添加到我的答案中。请注意,使用这些方法,您应该始终确保用户输入将适合分配的内存,即在第一种情况下,在
person中输入名称。超过49个字符的名称将导致未定义behaviour@Pankrates很好,谢谢。我忘了把它加到我的答案里。