首頁  >  問答  >  主體

c++ - 函数返回char类型数组,调用 函数后如何接收值?

我现在刚在学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;   
}
高洛峰高洛峰2765 天前759

全部回覆(3)我來回復

  • 黄舟

    黄舟2017-04-17 15:26:13

    不要直接傳回函數內部宣告的數組,函數退出後棧就會回收。要嘛就像你用的fgets一樣,在函數外部定義緩衝區,然後把緩衝區和長度當作函數參數傳進去。或者你可以在函數內部malloc一段char的內存,在內部將尾0寫好,然後返回這個地址,使用完之後在外部free掉,當然這麼做是不好的編程習慣,可以再封裝一個destroy函數,使用完畢後,將傳回的位址當作參數穿進去,把在get函數裡所有申請的記憶體全部釋放掉。

    回覆
    0
  • 阿神

    阿神2017-04-17 15:26:13

    你的data在堆疊上,函數回傳堆疊就被回收了,存取data會造成不可預測的錯誤。

    在main函數中宣告data,然後透過參數把data傳遞到getFileRows接受資料。

    回覆
    0
  • PHP中文网

    PHP中文网2017-04-17 15:26:13

    應該在函數外部宣告一個data的數組,把數組位址和數組長度作為參數傳入函數,在函數內部進行資料的讀取保存,(數組名作為指針使用,函數內部不再聲明數組)

    回覆
    0
  • 取消回覆