2014-01-26 3 views
0

Это фрагмент кода. Формат словаря: {word word \ n word word \ n ...}Ошибка 2D-массива с динамической нереальностью

Программа, похоже, терпит неудачу во второй раз, когда она перераспределяет 2D-массив roWords, и я не могу его вычислить.

В объявлении: 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''. Кроме того, 'realloc'ing после настройки выглядит немного сложнее, чем нужно. Возможно, более понятно использовать 'malloc' для выделения памяти для слов. –

+0

Программа хорошо работает для первого цикла, но когда она читает вторую строку из файла дикции, она снова вводит функцию, которая хороша, она увеличивает счетчик, который также является богом, но когда он снова вводит «roWords = (char * *) realloc (roWords, sizeof (char *) * counter); " он показывает, что отладка Assertion Failed. Любые предложения? –

ответ

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

Смежные вопросы