所以我想从文件中获取所有行并将它们转换为char *数组。问题是,每当我尝试将字符附加到元素的末尾时,它就会产生分段错误。
char** loadOutputs(char *fileName, int *lineCount)
{
FILE *file = fopen(fileName, "r");
if (file) {
char c;
int lines = 0;
while ((c = fgetc(file)) != EOF)
if (c = '\n')
lines++;
rewind(file);
char **output = malloc(lines * sizeof(char*));
for (int i = 0; i < lines; i++)
output[i] = "";
int index = 0;
while ((c = fgetc(file)) != EOF)
if (c == '\n')
index++;
else
strcat(output[i], &c);
return output;
}
return NULL;
}
我总是在strcat(output[i], &c);
处遇到分段错误。我宁愿不为输出创建一个固定的数组大小,因为这可能会变得相当大,我不想使用太多的内存。
答案 0 :(得分:1)
以下代码:
for (int i = 0; i < lines; i++)
output[i] = "";
将指针设置为空的只读字符串。
您需要为字符串分配一些内存:
即
for (int i = 0; i < lines; i++) {
output[i] = malloc(MAX_LINE_LENGTH + 1);
}
MAX_LINE_LENGTH
是某个定义的常量 - 也许是#define MAX_LINE_LENGTH 100
。
在阅读行时,您需要检查是否超过此长度。
以下代码将执行此操作。这将解决另一个问题,即c
的地址不会指向空终止字符串。
int index = 0;
int position = 0;
while ((c = fgetc(file)) != EOF) {
if (c == '\n') {
output[index][position] = 0; // Null terminate the line
position = 0; // Restart next line
index++;
} else {
if (position < MAX_LINE_LENGTH) { // Check if we have space!
output[index][position] = c; // Add character and move forward
position++;
}
}
}
output[index][position] = 0; // Add the null to the final line
此外,您需要声明c
as和int - 即将char c
更改为int c
。这是因为EOF超出了char