fscanf вылетает при попытке программы сканировать остальные текстовые файлы

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

По какой-то причине 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.

1 ответ

Решение

У вас неправильный цикл, связанный здесь:

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 персонажи длинные.

Другие вопросы по тегам