2016-02-05 2 views
0

У меня есть текстовый файл с именем dictionary, в первой строке это int, который сообщает нам, сколько слов находится в словаре. После первой строки это последующая серия строк со словом на каждом.fscanf сбой программы при попытке сканирования в остальном текстовом файле

По какой-то причине fscanf читает в первой строке (целое число) без проблем, но когда я пытаюсь читать в строке с циклом, он падает прямо там и там. Я не уверен, что ошибка как визуальные студии просто дает мне необработанное исключение в каком-то другом файле (я предполагаю, что это код для функции fscanf).

#include <stdio.h> 
#include <stdlib.h> 
#define MAXWORDLENGTH 19 
const int DX_SIZE = 8; 
const int DX[] = {-1,-1,-1,0,0,1,1,1}; 
const int DY[]= {-1,0,1,-1,1,-1,0,1}; 

char** storeDictionary(); 

int main(void){ 
char** dictionary; 
dictionary = storeDictionary(); 
system("pause"); 
    return 0; 
} 

char** storeDictionary(){ 
    int i; 
    int j; 
    FILE *fp; 
    char** dictionary; 
    fp = fopen("dictionary.txt", "r"); 
    int amountOfWords; 
    fscanf(fp,"%d", &amountOfWords); 
    dictionary = calloc(amountOfWords, sizeof(char*)); 
    for (i = 0; i < MAXWORDLENGTH; i++){ 
     dictionary[i] = calloc(MAXWORDLENGTH, sizeof(char*)); 
    } 
    if (dictionary == NULL){ 
     printf("Allocation failed"); 

    } 
    for(i=0; i< amountOfWords; i++){ 
     for (j = 0; j < MAXWORDLENGTH; j++){ 
      fscanf(fp, "%s", dictionary[i]); 

     } 
    } 
    fclose(fp); 
    for(i =0; i<amountOfWords;i++){ 
     printf("%s",dictionary[i]); 
     printf("\n"); 

    } 

    return dictionary; 

} 

Также я могу динамически выделять неправильно, но я пробовал различные способы и получить тот же сбой в fscanf в петле.

+0

Вы должны проверять возвращаемые значения из 'fopen()', 'fscanf()' и 'calloc()', чтобы гарантировать, что вы не получите преждевременных сбоев. Вы проверяете «словарь», но слишком поздно делать что-то хорошее. Вы также не выделяете достаточное пространство, если 'amountOfWords' (более правильно обозначенный' numberOfWords') меньше, чем 'MAXWORDLENGTH', и вы выделяете в 4 или 8 раз больше места, чем вам нужно для каждой строки. Если это исправлено, ваш код будет безопасен только в том случае, если ваш словарь не включает в себя «антидистабилизаторство» (28 букв) или «floccinaucinihilipilification» (29) или «supercalifragilisticexpialidocious» (34). –

+0

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

+0

@JonathanLeffler А я все понимаю, спасибо, что всегда буду проверять возвращаемые значения. – Jude

ответ

0

Вы имеете неправильный цикл связан здесь:

for (i = 0; i < MAXWORDLENGTH; i++){ 
    dictionary[i] = calloc(MAXWORDLENGTH, sizeof(char*)); 
} 

Изменить это:

for (i = 0; i < amountOfWords; i++){ 
    dictionary[i] = calloc(MAXWORDLENGTH, sizeof(char*)); 
} 

Джонатан Леффлера также указывает на то, что размер, используемый в этих calloc вызовов неправильно. sizeof(char *) должно быть sizeof(char) в этих вызовах.

Конечно, вам необходимо гарантировать, что каждая строка не более MAXWORDLENGTH - 1 символов.

+0

Он также выделяет достаточно длины для байтов 'char *', а не 'MAXWORDLENGTH'. –

+0

О, да, это хороший указатель (хотя в конечном итоге он выделяет больше, чем нужно). –

+0

Я поймал 'calloc()' vs 'malloc()' - ваш анализ (перераспределение, а не недораспределение) верен. –

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