问题描述
我现在刚在学C语言,今天想要实现一个功能:
用C语言读取一个文件的指定行,(如读取a.log文件的3--5行),现在实现了读取函数, 但在main函数调用时不知道怎么接收返回的值。
代码如下:
#include <stdio.h>/* 读取a.log中第3行到第5行的内容 */#define MAXLIN 100#define FILENAME 'a.log' char* getFileRows(char* filename,int start_line, int end_line);int main(){ getFileRows(FILENAME,3,5); /* getFileRows 函数返回的是 data[3][100] 这种的char类型数组。 getFileRows 函数返回的是char类型的数组, 我这里应该怎么定义变量,来接收返回值呢? */ return 1; }/* 读取文件, 读取 start_line 到 end_line 行之间的内容*/char* getFileRows(char* logfile,int start_line, int end_line){ int k=0,i = 0 ; int pos = 1; char c; int line = end_line - start_line; char data[line][MAXLIN]; FILE* fp = fopen(logfile,'r');if(fp == NULL){ printf('FILE OPEN ERROR'); getchar(); exit(1); } while(i<start_line && !feof(fp)){fseek(fp,pos,SEEK_SET); while( (c=fgetc(fp)) != NULL){ pos++; if(c == ’n’){ break; } } i++; } for(k=0;k<=line;k++){fgets(data[k],MAXLIN,fp); } return data; }
问题解答
回答1:不要直接返回函数内部声明的数组,函数退出后栈就会回收。要么就像你用的fgets一样,在函数外部定义缓冲区,然后把缓冲区和长度作为函数参数传进去。或者你可以在函数内部malloc一段char的内存,在内部将尾0写好,然后返回这个地址,使用完之后在外部free掉,当然这么做是不好的编程习惯,可以再封装一个destroy函数,在使用完之后,将返回的地址作为参数穿进去,把在get函数里所有申请的内存全部释放掉。
回答2:你的data在栈上,函数返回栈就被回收了,访问data会造成不可预知的错误。
在main函数中声明data,然后通过参数把data传递到getFileRows中接受数据。
回答3:应该在函数外部声明一个data的数组,把数组地址和数组长度作为参数传入函数,在函数内部进行数据的读取保存,(数组名作为指针使用,函数内部不再声明数组)