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