将文本文件行存储到数组

时间:2019-10-29 14:55:03

标签: c arrays

我正试图从文件中获取文本并将其存储到2d数组中,每行将是不同的行,而每个单词将是不同的列,我当时想先存储行然后将单词分开,但这在下面是不正确的while循环可以正确打印,但是在循环数组之外只有最后一行有帮助吗?

    char **arr;
    arr=malloc(sizeof(int)*line);
    int a ;
    for(a=0;a<line;a++){
        arr[a]=(char*)malloc(sizeof(int)*maxword);
    }
    int i=0;
    rewind(fp);
    while(fgets(command,count, fp)!=NULL) {
        arr[i]=command;
        printf("%s",arr[i]);

        i++;

    }

1 个答案:

答案 0 :(得分:0)

这里的问题是您尝试将输入command字符串复制到您的arr字符串数组中的方式。您所在的行:

arr[i]=command;

arr[i]处的字符串指针分配了字符串指针command的值,该值是command字符串的开始。然后,当您在循环 中打印出该循环时,由于您刚刚读入了该字符串,因此循环显示正确。

但是,在循环的每次迭代中,您都在给'next'arr[i] 相同的指针 ({{1}的开始}字符串)。因此,当您在循环结束后再打印出每个command字符串时,每个字符串将 指向同一字符串 ,该字符串的最后一个值将为-读过arr[i]

相反,在循环中,您应该使用以下内容替换上面的行:

command

这将复制strcpy(arr[i], command); 的内容到由command索引的字符串。

试试看!并且随时要求进一步的澄清和/或解释。

编辑:此外,正如 user3121023 在评论中指出的那样,您需要释放为arr[i] 分配的内存,但前提是您已完全使用它!您可以通过调用arr函数来实现此目的,该函数对应于您的每个free调用:

malloc

EDIT2:哦,我忘了!正如 Bodo 所指出的(感谢提醒),您永远不能假定指针具有任何给定的大小。你有:

for(a=0;a<line;a++){
    free(arr[a]); // First, run through a loop freeing each row ...
}
free(arr); // ... and only then free the "array of row pointers!"

假定指向字符的指针的大小为arr=malloc(sizeof(int)*line); 。它可能在某些平台上运行,但永远不要依赖于此。改用它:

int