c - C:初始化字符指针(字符串)数组并使用 fgets 遍历文件以将值放入这些字符串中
问题描述
我想创建一个长度为 6 的字符指针(字符串)数组,
但我想通过遍历一个\n
恰好分隔 6 行的文件来初始化它们
char* a[6];
FILE *fp = fopen("test.txt", "r");
for (int i = 0; i < 6; i++)
{
fgets(a[i], MAXLEN, fp);
}
但它给了我一个分割错误。
如果有人可以先为此编写代码,然后解释到底是什么错误,那就太好了,谢谢。
解决方案
这里
char* a[6];
a
是一个array of six char pointer
和这里
fgets(a[i], MAXLEN, fp); /* a[i] is a pointer & it doesn't have valid address, storing something into unreserved memory causes seg.fault */
它会导致分段错误,因为您试图将MAXLEN
字节存储到每个字节中a[i]
,但您没有分配内存来存储相同的字节。因此,要么首先为下面的每个分配内存,a[i]
然后将数据存储到其中,要么您可以使用二维 char 数组,如char a[num_of_line][max_char_line];
.
for (int i = 0; i < 6; i++) {
a[i] = malloc(MAXLEN); /* you can allocate as per req. */
fgets(a[i], MAXLEN, fp); /* read manual page of fgets(), it stores \n at end of buffer in some condition, be aware of that */
}
fopen()
还要检查and的返回值fgets()
。并且一旦动态内存的使用完成,释放动态分配的内存以避免内存泄漏。
推荐阅读
- amazon-web-services - 从 Salesforce 到 AWS S3 的 ListObjects 请求导致“拒绝连接”错误
- testing - 标题内容中的无效字符 ["Host"] 邮递员
- javascript - Axios POST 请求数据显示为未定义
- java - Java - 比较两个字符串 - unicode/ascii 敏感
- python - Discord.py 中的错误?
- vue.js - 运行时如何纠正这种类型的警告(npm t)node_modules/@vue/test-utils/dist/vue-test-utils.js:1704 Vue.js中的这个错误?
- r - R 闪亮 - 动画随机数到 ValueBox
- autohotkey - 如何解决 ControlSetText 和“保存文件”对话框之间的这个奇怪问题
- python - 如果用户通过 SSH 连接到不存在的用户,如何运行脚本?
- angular - ERROR 错误:找不到带有路径的控件:Angular FormArray