2010-02-06 67 views
1

我有這個程序的問題。這個想法是從文本文件中讀取字符串,並將它們包含在具有恆定列數和不同行數的2D動態數組中。如果初始行數不足以包含所有字符串,則必須重新分配數組的內存塊。代碼編譯正常,但執行是不可能的。2D動態數組重新分配

#include<stdio.h> 
#include<stdlib.h> 
#include <string.h> 
#define SIZE 80 
#define DELTA 5 

char** include(char b[SIZE],char** p,int n,int k,int flag); 
void output(char **p,int k); 

int main(void) 
{ 
char **ptr; 
FILE *fp;  
int i=0,koef=1; 
char buffer[SIZE]; 

if((ptr=(char **)malloc(DELTA*sizeof(char *)))==NULL){ 
    printf("Error!Memory not allocated!\n"); 
    exit(1); 
} 
if((fp=fopen("test.txt", "r")) == NULL) { 
      printf("Cannot open file.\n"); 
      exit(1); 
} 
do{  
    if(fgets(buffer,sizeof(buffer),fp)==NULL){ 
     printf("Error while reding file!\n"); 
    exit(1); 
    } 
    if(i<(DELTA*koef)) 
    ptr=include(buffer,ptr,i,koef,1);                     
else { 
     koef++; 
     ptr=include(buffer,ptr,i,koef,2); 
} 
    i++;  
    }while(!feof(fp)); 

free(ptr);   

return 0; 
} 

char** include(char b[SIZE],char** p,int n,int k,int flag) 
{ 
    switch(flag){ 
     case 1: *(p+n)=(char *)malloc(sizeof(b)); 
       strcpy(*(p+n),b); 
     break; 
     case 2: if((p=(char **)realloc(p,k*DELTA*sizeof(char *)))==NULL){ 
        printf("Error!Memory not allocated!\n"); 
        exit(1); 
     } 
     *(p+n)=(char *)malloc(sizeof(b)); 
     strcpy(*(p+n),b);  
     break; 
} 
    return p; 
} 

void output(char **p,int k) 
{ 
    int j; 
    for(j=0;j<k;j++) 
    printf("%s\n",*(p+j)); 
} 
+1

這功課嗎? – batbrat 2010-02-06 13:45:44

回答

0

fgets()返回時到達文件結束或有誤差的NULL。在你的情況下,當你在do-while循環中檢查時, ,因此在檢查fgets()的返回值時退出條件爲feof(fp)
你應該這樣做:


while(fgets(buffer,sizeof(buffer),fp)!=NULL) 
{ 
    if(ferror(fp)) 
    { 
    printf("Error Reading file\n"); 
    exit(1); 
    } 
    if(i <(DELTA*koef)) 
    ptr=include(buffer,ptr,i,koef,1); 
    else { 
     koef++; 
     ptr=include(buffer,ptr,i,koef,2); 
    } 
    i++; 
} 


2

指定數組參數的大小沒有任何影響。

void func(char b[SIZE]); 

是相當於

void func(char *b); 

因此,當你說

case 1: *(p+n)=(char *)malloc(sizeof(b)); 

sizeof運算將計算爲一個字符指針的大小。嘗試使用

case 1: *(p+n)=(char *)malloc(SIZE * sizeof(b)); 

,你說

*(p+n)=(char *)malloc(sizeof(b)); 

,你可以改變爲

*(p+n)=(char *)malloc(SIZE * sizeof(b)); 

您應該設置大小,使緩衝區有空間,包括整條生產線發生同樣的錯誤換行符和終止\ 0。否則,strcpy將無法正常工作。無論如何,你應該使用strncopy。一旦你做出這些改變,一旦達到文件結尾,fgets將返回0,你的程序將報告「錯誤,同時reding文件!」。您應該相應地更改讀取循環的終止。

此外,你實際上沒有使用多維數組。您正在使用指向數組字符的指針數組。在C中,一個二維數組將被分配在一個連續的內存塊中,並按行優先順序訪問。這在你的情況下是可以的,因爲所有的行應該具有相同的長度。儘管如此,你正試圖維護一個指向數組的指針數組。這也行得通,但在技術上我們不會稱之爲C中的多維數組。它被稱爲Iliffe vector或者僅僅是陣列陣列

總而言之,你的代碼是相互交織在一起的,難以遵循。您應該嘗試簡化您的程序,以便將來爲您找到更容易發現的錯誤。