将文件中的字符串存储到动态分配的数组中

时间:2018-12-30 22:58:17

标签: c

我正在从文件中读取单词,确切的编号为2243。并且我正在尝试将它们存储在数组中,以便以后可以在程序中读取它们。代码是内部函数。该文件没有句子,只有一个单词在另一个单词下面。

char** fill_word_array(char* filename){
    int i = 0, j = 0;
    int lines = 0;

    char str[20];
    char *array[i][j];

    array[i][j] = malloc(lines * sizeof(char*));


    FILE * fp = fopen("words.txt", "r");
    if (fp == NULL)
    {
        printf("Cannot open file");
        return 0;
    }

    while (fscanf(fp, "%s", str) != EOF)
    {
        lines++;
    }
    printf("%d\n", lines);

    fseek(fp, 0, SEEK_SET);

    array[i][j] = malloc(sizeof(char*) * lines);
    for(i = 0; i <= lines; i++)
    {
        strcpy(array[lines][j], str);
        printf("%s", array[i][j]);
    }

    return 0;
}

此代码仅打印文件的最后一个字,如http://tinypic.com/r/2zhjmgx/9所示。

1 个答案:

答案 0 :(得分:1)

char *array[i][j]i==0j==0这样的声明将保留大小为0的数组,这样即使位置array[0][0]也无法合法访问(未定义的行为)。因此,当您编写array[i][j] = malloc(lines * sizeof(char*))时,您已经写入array[0][0]并产生UB。

通常,一个人因向寻求帮助的人提供解决方案而受到社区的惩罚,从而使他有机会自己创造经验。但是,对于您的成熟程度,在我看来练习很辛苦,因此我将按照您的方法提供一种解决方案,并描述要考虑的事情。

希望有帮助。

采用您的方法,您需要...

  1. 数词
  2. 为“单词* sizeof(char *)”分配空间+ 一个单词在末尾存储一个NULL指针(否则用户 您的结果将不知道在哪里停止。
  3. 倒带并循环阅读每个单词;
  4. 在循环中,复制临时单词内容并将其存储在数组中
  5. 循环后,编写 最后的NULL指针。
  6. 返回数组(并告诉用户他 以后必须释放内存)

代码如下:

char** fill_word_array(char* filename){

    int words = 0;
    char str[100];
    char **array;

    FILE * fp = fopen("words.txt", "r");
    if (fp == NULL)
    {
        printf("Cannot open file");
        return 0;
    }

    while (fscanf(fp, "%s", str) != EOF)
    {
        words++;
    }
    printf("%d\n", words);

    fseek(fp, 0, SEEK_SET);

    array = malloc(sizeof(char*) * (words+1));
    for(int i = 0; i < words && fscanf(fp, "%s", str) != EOF; i++)
    {
        array[i] = strdup(str);
    }
    array[words] = NULL;

    return array;
}

int main() {

    char **array = fill_word_array("someFile.txt");
    for (int i=0; array[i] != NULL; i++) {
        printf("%s\n", array[i]);
        free(array[i]);
    }
    free(array);
}