2015-06-20 94 views
0

所以這是一個真正的初學者問題,但我完全失去了。我試圖在一個文件夾中生成一個文件名字符串數組,以便我可以遍歷每個文件並提取一些信息。由於文件數量和文件名的長度不固定,我需要動態分配數組。這是迄今爲止的代碼,它從文件夾獲取文件名,但是當嘗試將名稱分配給數組時,會出現錯誤。初始化一個未知數字和未知長度的字符串數組

int main(int argc, char* argv[]) 
{ 
size_t alen; 
//input argument is folder path 
char src[6], dest[512]; 
strcpy(src, "*.log"); 
strcpy(dest, argv[1]); 
strcat(dest, src); 
int fcount = 0; 
char** lnames; 

WIN32_FIND_DATA FindFileData; 
HANDLE hFind; 

hFind = FindFirstFile(dest, &FindFileData); 
    while (hFind != INVALID_HANDLE_VALUE) 
    { 

     alen = strlen(FindFileData.cFileName); 
     *lnames = (char*)malloc(sizeof(char)*alen); 
     lnames[fcount] = FindFileData.cFileName; 
     fcount++; 
     if (!FindNextFile(hFind, &FindFileData)) 
     { 
      FindClose(hFind); 
      hFind = INVALID_HANDLE_VALUE; 
     } 
    } 
return(0); 
} 

的錯誤是「變量‘LNAMES’被而不被初始化用的」。但是,這不是什麼malloc應該做的?改革的方式我想使用相同的代碼來算的文件數量,然後做的:

char *lnames[fcount]; 

但[]值必須是一個常數,FCOUNT就不會那麼我很堅持。任何幫助將不勝感激。

+0

「是不是malloc的應該是什麼在做什麼?」 - 沒有。你malloc正在爲文件名分配空間,但是沒有什麼是分配/重新分配空間來指向文件名的指針。 –

回答

1

不,您的malloc()呼叫初始化*lnames而不是lnames。在這樣做時,它使用的值爲lnames,它的確未被初始化。

你需要額外的,是爲你的lnames陣列分配一些空間。每次添加文件名時,它都需要變長。 爲了提高效率,你會想這樣做分批,不是每一次,但這是一個良好的開端:

添加計數有多少名至今變量:

int numnames = 0; 

附近最佳。

變化lnames的聲明初始化:

char** lnames = NULL 

,你要添加一個新的名字每次做

numnames++; 
lnames = realloc(lnames, numnames * sizeof (char *)); 

而不是存儲您的malloc()編輯字符串(唐輸入malloc的結果!)在*lnames中,使用lnames[numnames - 1]

您還應該檢查錯誤(malloc()realloc()可能會失敗),但這將是一個好的開始。

我故意不給你一個完整的「完美」的編輯程序的版本,留下一些讀者練習(這是初學者的好;-)

+0

感謝您的及時回覆。做了更改,必須在realloc上添加(** char)。現在代碼編譯和運行的問題是,在循環後如果我打印lnames [0]和lnames [1]的值,它們具有相同的值,即文件夾中的最後一個文件(因此爲循環中的最後一個字符串),所以它似乎是用每個條目覆蓋整個陣列。 – Rob

+0

經過一些調試後,問題似乎是 FindFileData.cFileName 當FindNextFile被調用時,FindFileData.cFileName中的值更新並執行lnames中的所有值。我嘗試解引用FindFileData,但只是輸出垃圾。我再次被卡住了。 – Rob

+0

啊,再看看你的原代碼(注意我不能運行它,因爲我沒有使用MSWindows),我發現雖然你用'malloc'預留了一些實際的空間,你實際上並沒有用它!你用'FindFirstFile()'或FindNextFile()'('FindFileData.cFileName')返回的值立即覆蓋指向你分配的內存的指針。可能每次調用重新使用相同的內存來存儲文件名。因此,您應該使用'strdup()'複製名稱。另外,我看到你應該'malloc()'1多餘的字節:文件名字符串的終止零。 – Rhialto

相關問題