C 如何打印字符**
我有一个方法可以读取文件并将行分配给char**。但当我试图打印它的第一个元素时,它会打印随机字符。可能出了什么问题C 如何打印字符**,c,pointers,C,Pointers,我有一个方法可以读取文件并将行分配给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("
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;
}
问题1 问题在于:
**(all_lines+i) = *buffer;
all_lines = (char**)realloc(all_lines, sizeof(char*) * i);
它只从缓冲区
复制一个字符。因此,所有_行
中的字符串都不以空结尾
您应该替换以下行:
*(all_lines+i) = (char*)malloc(sizeof(buffer));
**(all_lines+i) = *buffer;
借
问题2
我看到的下一个问题是:
**(all_lines+i) = *buffer;
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);
因为您将在下一次迭代中使用所有\u行[1]
。这条线需要:
all_lines = (char**)realloc(all_lines, sizeof(char*) * (i+1));
问题1 问题在于:
**(all_lines+i) = *buffer;
all_lines = (char**)realloc(all_lines, sizeof(char*) * i);
它只从缓冲区
复制一个字符。因此,所有_行
中的字符串都不以空结尾
您应该替换以下行:
*(all_lines+i) = (char*)malloc(sizeof(buffer));
**(all_lines+i) = *buffer;
借
问题2
我看到的下一个问题是:
**(all_lines+i) = *buffer;
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);
因为您将在下一次迭代中使用所有\u行[1]
。这条线需要:
all_lines = (char**)realloc(all_lines, sizeof(char*) * (i+1));
sizeof(buffer)
没有达到您期望的效果;在那里使用您的size
变量<代码>**(所有_行+i)=*缓冲区只复制一个字符
。存在大量边界条件错误。试着坚持这种模式:while(read_it(the_data)==ok){process_it(the_data);}
。避免做。。。虽然,但它很少适用。如果在文件读取循环中嵌套了行读取循环,则将前者设为函数。sizeof(buffer)
没有达到预期效果;在那里使用您的size
变量<代码>**(所有_行+i)=*缓冲区只复制一个字符
。存在大量边界条件错误。试着坚持这种模式:while(read_it(the_data)==ok){process_it(the_data);}
。避免做。。。虽然,但它很少适用。如果在文件读取循环中嵌套了一个行读取循环,那么将前者作为一个函数。。我像你说的那样修改了代码,它正确地打印了第一行。但现在我无法打印第二行,我想知道为什么?第三个问题是我正在释放缓冲区的行,因为它实际上指向最后一行。我需要在完成工作后有空。很好,我可以继续前进!非常感谢。。我像你说的那样修改了代码,它正确地打印了第一行。但现在我无法打印第二行,我想知道为什么?第三个问题是我正在释放缓冲区的行,因为它实际上指向最后一行。我需要在完成工作后有空。很好,我可以继续前进!谢谢