2012-09-01 111 views
0

在C工作,我填充字符*返回值的陣列從一個函數C字符串數組比較

char* files[4][12]; 
int i = 0; 
for (;;) 
    { 
     char* file = get_value(); 
     strcpy(files[i],file); 
     i++; 
     if (i > 4 || external_condition) 
     break; 

    } 

     // When I break out of 
     // my for loop the following 
     // code executes 

     for (i = 0; i < 5; i++) 
     { 
     if (files[i] != NULL) 
     manipulate(files[i]); 
     } 

我的問題是,如果我打出來的第一個for循環,而不對所有分配值文件的元素,我在第二個for循環中的比較失敗。如果只有文件[0]和文件[1]具有內容,則循環無論如何處理文件[2],文件[3]和文件[4]。

+2

一個問題是你正在做'strcpy(files [i],file);'沒有爲指針'files [i]'分配任何內存。這將導致未定義的行爲。 –

回答

3

files被聲明爲「指向char的指針數組數組」。或者,如果你願意,作爲指向char的二維數組。

所以files[i]的類型是「指向char的指針數組」,但是您只是將它用作「指向char的指針」。那是錯的。

這就是說,目前尚不清楚你想要做什麼......也許只是:

char files[5][13]; 

會更有意義。 13因爲你可能需要13個char字符串(8.3是8 + 3 + 1 = 12加1爲結尾NUL),你似乎使用了5個字符串。然後將它們初始化爲零:

memset(files, 0, sizeof(files)); 

,並使用檢查:

if (files[i][0]) 

檢查,如果文本被初始化。

+0

或者'char files [4] [13]',考慮到8.3文件名加上nul終止符佔用13個字節。 –

+0

@SteveJessop:好想法。更新。 – rodrigo

+0

不需要sizeof文件的括號。 – oldrinb

0

char* files[4][12]char *的二維陣列,而不是char。也許你的意思是你的代碼如下:我建議你聽聽其他人說的話。我只是發佈了一個仍然有效的縮短版本。

char files[5][12] = { { 0 } }; 
int i = 0; 

do { 
    strcpy(files[i], get_value()); 
} while (++i <= 4 && !external_condition); 

while (i) { 
    manipulate(files[--i]); 
} 
+0

你有'strcpy()'參數交換。 – rodrigo

+0

@ rodrigo對不起... :-p – oldrinb

+0

再次感謝您的建議! – Alan