c - 将文本文件行存储到数组中
问题描述
我正在尝试从文件中获取文本并将其存储到二维数组中,每一行将是不同的行,每个单词将是不同的列我想先存储行然后单独的单词,但这在 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++;
}
解决方案
这里的问题是您尝试将输入command
字符串复制到字符串arr
数组中的方式。您拥有的线路:
arr[i]=command;
将字符串指针的值分配给字符串指针,arr[i]
该值是字符串command
的开头command
。然后,当您在循环中将其打印出来时,它会正确显示,因为您刚刚读入了该字符串。
但是,在循环的每次迭代中,您都给“下一个”arr[i]
相同的指针(command
字符串的开头)。arr[i]
因此,当您在循环完成后打印出每个字符串时,每个字符串都将指向同一个字符串,该字符串将具有上次读取的任何值command
。
相反,在您的循环中,您应该将上面的行替换为:
strcpy(arr[i], command);
这会将的内容复制到由 索引的command
字符串arr[i]
。
试试看!并随时要求进一步澄清和/或解释。
编辑:另外,正如user3121023在评论中指出的那样,您需要释放您分配的内存,arr
但前提是您完全使用它!您可以使用对free
函数的调用来执行此操作,对应于您的每个malloc
调用:
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!"
EDIT2:哦,我忘了!正如Bodo所指出的(感谢您的提醒),您绝不能假设指针具有任何给定的大小。你有:
arr=malloc(sizeof(int)*line);
它假定指向字符的指针的大小为int
. 它可能会在某些平台上运行,但永远不要依赖于此。改用这个:
arr=malloc(sizeof(char*)*line);
推荐阅读
- google-chrome-extension - 来自 chrome 扩展的调度事件清除事件数据传输
- python-3.x - 如何将包含 nan 的单元格的值更改为另一个特定值?
- sql - 在 sql 中对具有状态的实体进行建模,其中实体在推进状态时具有更多属性(休眠)
- python - 在 C++ 和 Python 程序中使用命名管道的 IPC 挂起
- python - xarray select\interpolate custom 1D slice out auf 多维数据(又名 zip 与 itertools.product)
- vbscript - 如何使用 VBS 创建 exe 文件
- android - 如何在博览会中获得旧证书并退出新的 apk?
- android - 如何在android中添加播放和停止不同的按钮歌曲
- asp.net - ASP.NET MVC 中的 post 数据中的响应数据为空
- python - 我不知道为什么我一直得到 12 < 3