2013-03-03 87 views
0

我無法在鏈接列表中存儲字符串。這是將節點插入列表的功能:在鏈接列表中存儲字符串時遇到問題

void insert_rec(rec_ptr *h_ptr, rec_ptr *t_ptr, int a, int b, int c, char* cs) 
{ 

    rec_ptr new_ptr;  
    new_ptr = rec_ptr(malloc(sizeof(REC))); 

    if(new_ptr != NULL) 
    { 
     new_ptr->x = a; 
     new_ptr->y = b; 
     new_ptr->z = c; 
     new_ptr->c = cs; 
     new_ptr->next = NULL; 

     if(*h_ptr == NULL){ 
      *h_ptr = new_ptr; 
     } 
     else{ 
      (*t_ptr)->next = new_ptr; 
     } 
     *t_ptr = new_ptr; 
    } 
    else 
    { 
     printf("%d %d %d not inserted. No memory available.\n",a,b,c); 
    } 
} 

這是從輸出文件讀取輸入的功能。我將一個字符串作爲char*插入列表中。 fscanf()已正確讀取該字符串。

void read_from_input2(rec_ptr & hptr, rec_ptr & tptr) 
{ 

    fp3=fopen("input2.txt","r"); 

    if (fp3 == NULL) 
     printf("Error: Couldn't open file: input2.txt\n"); 
    else 
    { 
     while(!feof(fp3)) 
     { 
      int x,y,z; 
      char c1[10]; 
      fscanf(fp3,"%d",&x); 
      fscanf(fp3,"%d",&y); 
      fscanf(fp3,"%d",&z); 
      fscanf(fp3,"%s",c1); 
      char *c2 = c1; 
      insert_rec(&hptr,&tptr,x,y,z,c2); 
     } 
    } 
    fclose(fp3); 
} 

這是我遇到問題的功能。當我從鏈表中提取數據時,變量c1輸出垃圾。

void write_to_output2(rec_ptr hptr) 
{ 

    fp4=fopen("output2.txt","w"); 

    if (fp4 == NULL) 
     printf("Error: Couldn't open file: output2.txt\n"); 
    else 
    { 
     if(hptr == NULL){ 
      printf("List is empty.\n\n"); 
     } 
     else{ 
      while(hptr != NULL) 
      { 
       int x,y,z; 
       char *c1,*c2; 
       x = hptr->x; 
       y = hptr->y; 
       z = hptr->z; 
       c1 = hptr->c; 
       c2 = get_class(x,y,z); 
       fprintf(fp4,"%d %d %d %s %s\n",x,y,z,c1,c2); 
       hptr = hptr->next; 
      } 
     } 
    } 
    fclose(fp4); 
} 

如果有人可以看到我的錯誤,請幫助我。謝謝。

回答

1
char c1[10]; 
/* ... */ 
char *c2 = c1; 
insert_rec(&hptr,&tptr,x,y,z,c2); 

的問題是c1read_from_input2在堆棧上,然後你存放指向其內容。當while結束時,它將超出範圍,因此對其的訪問將無效。

你會想要strdup它(或同等學歷)。

char *c2 = strdup(c1); 

/* or */ 

new_ptr->c = strdup(cs); 

,在某些時候不要忘了free它。

+0

謝謝你。我得到它的工作! – 2013-03-03 10:34:11