如何将 fgets 字符串结果存储到 char 数组中?

How to store fgets string results into an char array?

我目前收到以下错误

Process terminated with status -1073741819 

我怀疑是我的 fgets() 但我不知道为什么会这样,任何帮助将不胜感激。

 //Gets Dictionary from file
    char* GetDictionary() {
        int ArraySize;
        int i = 0;
        FILE * DictionaryFile;

        //Gets first line (in this case it is the amount of Lines)
        DictionaryFile = fopen("dictionary.txt", "r");
        fscanf(DictionaryFile,"%d", &ArraySize);
        ArraySize = ArraySize + 1;
        printf("%d", ArraySize);
        fclose(DictionaryFile);

        //Gets the array
        char* Dictionary = malloc(sizeof(char)*ArraySize);
        char Temp[ArraySize];
        char TempArray[ArraySize];

        DictionaryFile = fopen("dictionary.txt", "r");
        while(fgets(Temp, sizeof Temp, DictionaryFile)!=NULL) {
          Dictionary[i] = Temp;
          //Check The array
          printf("%s", Dictionary[i]);
          i++;
        }

        fclose(DictionaryFile);
        return Dictionary;
    }

您可能希望 Dictionary 是一个 char 字符串数组。即Dictionary是一个数组,数组中的每个元素都是一个char *。这使得 Dictionary 成为 char **.

对于此示例,最直接的方法可能是为 Dictionary 数组本身分配内存,然后为其内容分配内存。当然,完成后您需要释放所有这些。

char **Dictionary = malloc(sizeof(char *) * ArraySize);
for (int i = 0; i < ArraySize; i++) {
    Dictionary[i] = malloc(ArraySize);
}

有更好的方法可以做到这一点。一方面,您可能只在需要时为每个 fgets() return 分配内存。您也可以使用 strdup() 只分配您需要的内存。你也可以从调用者那里传入 Dictionary,已经分配了,所以你不用担心在这里分配它。

稍后在您的程序中,正如@WhozCraig 指出的那样,您需要复制 Temp 中的字符串,例如 strcpy(Dictionary[i], Temp),以代替 Dictionary[i] = Temp。我也很惊讶没有生成编译器警告!

-1073741819 --> C0000005 可能具有一定意义。或许用下面来辨别它的意思。

puts(strerror(-1073741819));

代码有很多问题:这里有一些更正以帮助您继续。

1) 分配一个指针数组,而不是char

的数组
// char* Dictionary = malloc(sizeof(char)*ArraySize);
char** Dictionary = malloc(ArraySize * sizeof *Dictionary);

2) 形成一个大缓冲区来读取每一行

 char Temp[100];

3) 读完每一行后,去掉可能尾随的'\n'

 size_t len = strlen(Temp);
 if (len && Temp[len-1] == '\n') Temp[--len] = 0;

4) 为那个词分配内存并保存

 Dictionary[i] = malloc(len + 1);
 assert(Dictionary[i]);
 memcpy(Dictionary[i], Temp, len + 1);

5) 健壮的代码在完成前释放它的分配

6) 代码读取 "amount of Lines" 两次,因为文件被打开两次。保持文件打开(而不是重新打开它)。