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

时间:2015-09-04 20:47:52

标签: c arrays string char fgets

我目前收到以下错误

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;
    }

2 个答案:

答案 0 :(得分:2)

-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)代码读取"行数"两次打开文件两次。只是让文件保持打开状态(而不是重新打开它)。 @user3386109

答案 1 :(得分:0)

您可能希望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()返回,您可能只在需要时分配内存。您还可以使用strdup()仅分配所需的内存。你也可以从已经分配的来电者那里传递Dictionary,这样你就不用担心在这里分配它了。

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