2016-02-07 2 views
1

В настоящее время я пытаюсь написать функцию, которая сканирует слова из файла словаря. Он отлично работает в отладчике, но когда я его компилирую и запускаю, он падает после сканирования пяти слов. Вот мой код:Проблема со сканированием в словах из файла (в C)

char** readDictionary(FILE *ifp, int size){ 
    int i; 
    char** dictionary; 
    char buffer[21]; 

    dictionary = malloc(sizeof(char*) * size); 
    if(dictionary == NULL){ 
     printf("dictionary allocation ERROR"); 
     return NULL; 
    } 

    for(i=0; i<size; i++){ 
     fscanf(ifp, "%s", buffer); 
     printf("%s\n", buffer); //debugging statement 
     dictionary[i] = malloc(sizeof(char) * strlen(buffer)); 
     strcpy(dictionary[i], buffer); 
    } 

    return dictionary; 
} 

В отладчике все слова сканируются должным образом. Когда я бегу без отладчика, я рушился после пятого слова.

вот список моих первых слов (опять же, он выходит из строя после того, как трубкозубов): aahing ахи AALS Aardvark трубкозубов протел aardwolves

Я не знаю, почему это могло произойти. Пожалуйста помоги.

+0

Проверьте значение 'fscanf()' return. Не используйте 'sizeof (char)' это просто '1' и всегда будет, также вам нужен завершающий * null * байт. –

+0

Причина такой работы в отладчике заключается в том, что отладочная версия программы часто имеет запаздывающие блоки памяти, поэтому забывание \ 0 может показаться сработавшим. –

ответ

3

Вы не размещаете место для прерывания null байт. Изменение

dictionary[i] = malloc(sizeof(char) * strlen(buffer)); 
strcpy(dictionary[i], buffer); 

в

size_t length = strlen(buffer); 
dictionary[i] = malloc(length + 1); 
if (dictionary[i] != NULL) 
    memcpy(dictionary[i], buffer, length + 1); 

Или еще лучше

dictionary[i] = strdup(buffer); 

Кроме того, убедитесь, что fscanf() не фэйл, если он не вернет 1 в вашем случае.

+0

strdup работал отлично! Спасибо. Просто чтобы убедиться, что это часть стандартной библиотеки C? –

+0

@remington howell No., 'strdup()' не в стандартной библиотеке C. Это обычное явление. – chux

+0

@remingtonhowell Но в большинстве библиотек [tag: c] есть эквиваленты. –

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