我是C的新手,我正试图绕过多维字符数组的初始化,为了我的作业,我被要求从文件中读取并将文本存储在数组中,
我必须阅读5个虚构人的输入并存储一些关于它们的信息,所以我意识到我的数组看起来像:
char input[5][];
我感到困惑的是第二个参数,我不知道该怎么设置它。我将存储有关于这些人的9个信息领域,如果我将第二个数字设置为字段数量或者应该有多大,我似乎无法找到答案。即,
char input[5][9];
或
char input[5][256];
另外,如果是后者,是否有一种做法,我应该设置多大,或者只选择一个数字?谢谢!
答案 0 :(得分:5)
我建议您采取以下方法:您应该创建一个char
人,而不是使用struct
数组来存储有关这些人的信息,而这个人将拥有一些具有预定义长度的信息变量
struct person {
char name[50];
char address[50];
char phone_number[15];
};
或者,如果你愿意,你可以制作这些char指针(比如char *name
,char *address
),然后你可以malloc()
为每个变量提供所需的内存量想要(也是,在使用它之后不要忘记free
内存)。
然后,在你的主体中,你可以制作一组人,例如struct person[5];
,并根据需要操纵它们。
编辑:还要注意,正如Pankrates所评论的,当你为数组定义一个大小时,你必须确保输入不会超过数组的长度,否则你将会写内存上不属于你的内容,导致undefined behavior。
答案 1 :(得分:2)
要想明白这一点,你应该尝试了解输入。如果您完全确定5个人只有9个字段(单个字符数据),那么您应该将其设置为char input[5][9]
。
如果您认为将来可能会有比9更多的信息领域,那么您可以获得更高的价值,例如char input[5][256]
。但是,如果字段数据稀疏,则会浪费大量空间。这是内存的静态分配
因此,当您不确定每个人的字段数时,第三个选项是动态分配内存,如 -
char* input[5];
input[0] = malloc(sizeof(char) * 100); // space of 100 chars
在最后一种情况下,内存是在运行时而不是编译时给出的。您还可以从用户输入中获取大小,并使用它为字段分配内存。
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];
...
};