У меня есть текстовый файл с именем 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 в петле.
Вы должны проверять возвращаемые значения из 'fopen()', 'fscanf()' и 'calloc()', чтобы гарантировать, что вы не получите преждевременных сбоев. Вы проверяете «словарь», но слишком поздно делать что-то хорошее. Вы также не выделяете достаточное пространство, если 'amountOfWords' (более правильно обозначенный' numberOfWords') меньше, чем 'MAXWORDLENGTH', и вы выделяете в 4 или 8 раз больше места, чем вам нужно для каждой строки. Если это исправлено, ваш код будет безопасен только в том случае, если ваш словарь не включает в себя «антидистабилизаторство» (28 букв) или «floccinaucinihilipilification» (29) или «supercalifragilisticexpialidocious» (34). –
Кроме того, при отладке вы должны распечатывать каждое слово, когда оно читается, что расскажет вам больше о том, когда произойдет сбой. Убедитесь, что вы завершаете каждую операцию печати с помощью новой строки. –
@JonathanLeffler А я все понимаю, спасибо, что всегда буду проверять возвращаемые значения. – Jude