fscanf 在尝试扫描文本文件的其余部分时使程序崩溃

fscanf crashing the program as it tries to scan in rest of text file

我有一个名为 dictionary 的文本文件,第一行是一个整数,告诉我们字典中有多少个单词。第一行之后是后续的一系列行,每行都有一个词。

出于某种原因,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 处遇到了同样的崩溃。

您在此处绑定了错误的循环:

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

改为:

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

Jonathan Leffler 还指出,这些 calloc 调用中使用的大小是错误的。 sizeof(char *) 在这些调用中应该是 sizeof(char)

当然,你需要保证每个字符串的长度不超过MAXWORDLENGTH - 1个字符。