我正试图从文件中获取文本并将其存储到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++;
}
答案 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