2014-01-26 19 views
0

這是代碼片段。字典格式是:{單詞\ n單詞\ n ...}二維char數組動態定位失敗

該程序似乎失敗了第二次它重新分配二維數組royn,我不能圖解它爲什麼。

在聲明中:char ** roWords = NULL,** enWords == NULL;

while (fgets(buffer, 100, dictionary)) 
    { 
     counter++; 

     roWords = (char**)realloc(roWords, sizeof(char*)* counter); 
     enWords = (char**)realloc(enWords, sizeof(char*)* counter); 

     p = strtok(buffer, " \n"); 


     roWords[counter - 1] = NULL; 
     roWords[counter - 1] = (char*)realloc(roWords, sizeof(char)* strlen(p)); 
     strcpy(roWords[counter - 1], p); 


     p = strtok(NULL, " \n"); 


     enWords[counter - 1] = NULL; 
     enWords[counter - 1] = (char*)realloc(enWords, sizeof(char)* strlen(p)); 
     strcpy(enWords[counter - 1], p); 


    } 
+0

它是如何下降?是否有錯誤訊息? – JVMATL

+0

記得爲終止的''\ 0''分配一個額外的字符。另外,設置後的重新分配看起來比它應該更復雜一些。使用'malloc'來分配單詞的內存也許更加清晰。 –

+0

該程序適用於第一個循環,但是當它從de dictionray文件讀取第二行時,它再次進入函數,這很好,它增加了計數器,這也是上帝,但是當他再次輸入「roWords =(char * *)realloc(roWords,sizeof(char *)* counter);「它顯示調試斷言失敗。任何消化? –

回答

0

的解決方案是:

while (fgets(buffer, 100, dictionary)) 
{ 
    counter++; 

    if (counter == 1) 
    { 
     roWords = (char**)malloc(sizeof(char*)); 
     enWords = (char**)malloc(sizeof(char*)); 
    } 
    else 
    { 
     roWords = (char**)realloc(roWords, sizeof(char*)* counter); 
     enWords = (char**)realloc(enWords, sizeof(char*)* counter); 
    } 

    p = strtok(buffer, " \n"); 


    roWords[counter - 1] = (char*)malloc(sizeof(char) * (strlen(p) + 1)); 
    strcpy(roWords[counter - 1], p); 
    roWords[counter - 1][strlen(p)] = '\0'; 

    p = strtok(NULL, " \n"); 


    enWords[counter - 1] = (char*)malloc(sizeof(char)* (strlen(p) + 1)); 
    strcpy(enWords[counter - 1], p); 
    enWords[counter - 1][strlen(p)] = '\0'; 

} 
+0

'strtok(buffer,「\ n」);'並不總是刪除''\ n''。當'buffer' - >'「\ n」'試試。 ''\ n''仍然存在。 – chux