2013-03-03 4 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

감사합니다. 나는 그것을 작동하게했다! –

관련 문제