2017-06-02 65 views
-1

我有動態分配的一些問題,因爲我不想指定數組的大小。基本上我在我的程序中需要的是將一個文件的名稱存儲在一個數組中,並確保它不會浪費空間。如何在C中動態分配名稱數組?

我試圖做類似創建陣列name[255],以確保它有足夠的空間,然後動態地分配它,所以它只有所需的空間,就像寫「matrix5」,然後將其存儲在name[255]然後更改name[255]name[8]

char file_name[255]; 

printf("what is the name of the file? [.txt]\n"); 
scanf_s(" %s", file_name[255]); //store name eg: "matrix5" 

i = 0; 
char **fullpath; 
while (file_name[i] != '\0' && i <=strlen(file_name)) 
{ 
    fullpath= (char**)malloc(sizeof(char*)); //In here it would then make file_name[255] into file_name[8]        
    fullpath[i] = file_name[i]; 
    i++; 
} 

我需要在這裏做什麼?

+3

發佈您使用的代碼,樣本輸入和預期輸出。 – chux

+3

一如既往,'scanf_s()'使用不正確。 – EOF

+2

'scanf_s(「%s」,file_name);'缺少長度參數。 – chux

回答

1

那你是怎麼會動態分配一個C-字符串:

char* name = malloc(sizeof(char)*(length+1)); //length of the filename plus \0 
+1

好奇,因爲'sizeof(char)'總是1,爲什麼用'sizeof(char)*(length + 1)'而不是'length + 1'或'sizeof * name *(length + 1)'? – chux

+0

我喜歡一致性,所以當需要int大小時,可以用'int'替換'char'。而且複製代碼修改變得更容易。 – Shiro

+5

我認爲這是'sizeof * name'這個建議的要點,它的維護率低,可以是一致的編碼風格。 –

0

你熟悉strdup

這將返回一個指向已分配內存的指針(稍後需要由您自由釋放)和一個字符串副本,並使代碼更加簡單。

提示:如果您不復制常量字符串,請使用strndup

3

文件名和路徑名通常具有系統可以處理的最大長度。示例MAX_PATH。聲明數組爲hold用戶輸入。國際海事組織,我會使用一個2x大小的陣列用戶輸入。

//        +1 for \n 
#define MY_BUFFER_SIZE (MAX_PATH*2 + 1) 
char my_buffer[MY_BUFFER_SIZE]; 

讀取文件名

printf("what is the name of the file? [.txt]\n"); 
if (fgets(my_buffer, sizeof my_buffer, stdin) == NULL) { 
    Handle_EnfOfFile_or_InputError(); 
    return NULL; 
} 

砍掉了潛在尾隨\ n

my_buffer[strcspn(my_buffer, "\n")] = '\0'; 

創建重複

return strdup(my_buffer); 

strdup()是不是一個獨立C庫函數但很容易編碼。 Example