2013-10-01 167 views
1

我对C相当陌生,我试图围绕多维字符数组的初始化进行包装,我的任务是要求我从文件中读取并将文本存储在一个数组,C多维字符数组初始化

我要读输入5虚构的人,并存储有关它们的一些信息,让我意识到,我的阵列看起来像:

char input[5][]; 

我感到困惑的是第二个参数,我不知道该怎么设置它。我将存储9个有关这些人员的信息字段,而且我无法找到答案,如果我应该将此第二个数字设置为字段数量或应该有多大。即,

char input[5][9]; 

char input[5][256]; 

此外,如果是后者,就是在那里,我应该怎么较大设置它,还是只挑选一些做法?谢谢!

回答

5

我建议你采取以下做法:不是制作char阵列来存储有关这些人的信息,你应该做一个struct人,其中将有一些信息变量,预定义lenght

struct person { 
    char name[50]; 
    char address[50]; 
    char phone_number[15]; 
}; 

或者,如果你愿意,你可以使这些字符指针(例如char *name,char *address),然后你可以malloc()所需的内存量给每个变量,如你所愿(同样,不要忘记使用free后的内存它)。

然后,在您的主体中,您可以创建一组人员,如struct person[5];,并根据需要操作它们。

编辑:另外请注意,正如Pankrates评论的那样,当你为你的数组定义一个大小时,你必须确保输入不会超过数组的长度,否则你会写内存的东西不属于你,这导致undefined behavior

+1

请注意,这些方法,你应该始终确保用户输入将适合分配的内存,即在第一种情况下进入'person.name'超过49个字符会导致不确定的行为的名称 – Pankrates

+0

@Pankrates很好,谢谢。我忘了将它添加到我的答案中。 – streppel

2

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

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

所以,当你不能确定每个人的字段数第三个选项,是分配内存中动态like--

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]; 
    ... 
};