2013-10-01 51 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]; 
    ... 
};