我有一个方法可以读取文件并将行分配给 char **。但是当我尝试打印它的第一个元素时,它会打印随机字符。可能有什么问题?
int main()
{
char **lines_from_file = read_from_file(file_name);
print_first_line(lines_from_file);
return 0;
}
void print_first_line(char **command_lines)
{
printf("%s", command_lines[0]);
}
char** read_from_file(char *file_name)
{
int size;
int c;
char *buffer;
char** all_lines= (char**)malloc(sizeof(char*));
FILE *f = fopen(file_name, "r");
if(f)
{
int i=0;
do // read all lines in file
{
size = 0;
buffer = (char *)malloc(size+1);
do // read one line
{
c = fgetc(f);
if(c != EOF) buffer[size++] = (char)c;
buffer = (char*)realloc(buffer, size+1);
}
while(c != EOF && c != '\n');
*(all_lines+i) = (char*)malloc(sizeof(buffer));
**(all_lines+i) = *buffer;
i++;
all_lines = (char**)realloc(all_lines, sizeof(char*) * i);
}
while(c != EOF);
fclose(f);
}
free(buffer);
return all_lines;
}
最佳答案
问题一
线路有问题:
**(all_lines+i) = *buffer;
这只是从 buffer
中复制了一个字符。因此,all_lines
中的所有字符串都不是空终止的。
你应该替换这些行:
*(all_lines+i) = (char*)malloc(sizeof(buffer));
**(all_lines+i) = *buffer;
通过
all_lines[i] = buffer;
问题2
我看到的下一个问题是:
all_lines = (char**)realloc(all_lines, sizeof(char*) * i);
在循环的第一次迭代中,i
为 1。因此,该行与:
all_lines = (char**)realloc(all_lines, sizeof(char*));
这不是你想要的。你想要
all_lines = (char**)realloc(all_lines, sizeof(char*) * 2);
因为您将在下一次迭代中使用 all_lines[1]
。该行需要是:
all_lines = (char**)realloc(all_lines, sizeof(char*) * (i+1));
关于c - 如何打印字符**,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40140054/