2014-03-18 4 views
1
#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 

typedef struct record 
{ 
    char*title; 
    char* year; 
    char* length; //in minutes 
} record; 

void read(record* list[]); 
void test(record* list[]); 

int main(int args, char* argv[]) 
{ 
    record* list[1024]; 
    read(list); //add record to list (pass by reference) 

    test(list); 

    write(list); 


    return 0; 
} 
void test(record* list[]) 
{ 
    int i; 
    for(i=0; i<1024; ++i) 
    { 
     if(list[i]!=NULL) 
     { 
      printf("%s index %d \n", list[i]->title ,i); 
     } 
    } 
} 

void read(record* list[]) 
{ 
    int j; //ini a array of pointer initially point to null 
    for(j=0;j<1024;++j) 
     list[j]=NULL; 

    FILE* input=fopen("input.txt","r"); //file in 
    if(!input) 
    { 
     printf("Error"); exit(1); 
    }else 
    { 
     int i=0; //index for adding elements to array 
     char temp[100]; 
     while(!feof(input)) 
     { 
      record* current_record=(record*)malloc(sizeof(record)); 

      fgets(temp,sizeof(temp),input); //temp is a line of file 
      char deli[]=" "; 

      char* result=NULL; 
      result=strtok(temp,deli); //titile info 
      current_record->title=result; 

      result=strtok(NULL,deli); //year 
      current_record->year=result; 

      result=strtok(NULL,deli); //length 
      current_record->length=result; 

      list[i]=current_record; //add to array 
      printf("%s \n",current_record->title); 
      ++i; 
     } 
     fclose(input); 
    } 
} 

이 내 프로그램이하는 것입니다 : 1. 구조체에 줄을 2 점을 선으로 모든 정보를 파일 라인을 읽고 배열에 모든 구조체를 저장합니다. 이 배열은 포인터의 배열입니다. 요소가 사용되지 않으면 포인터는 null을 가리 킵니다. 3. 시험 방법. 이 배열의 구조체에 데이터를 인쇄하고 싶습니다.포인터를 배열에 저장할 때 어디에서 오류가 발생합니까?

시험 방법이 이상한 결과를 인쇄했습니다. 아무도 내게 문제가 무엇인지 도울 수 있습니까? 말하지 말아라. 고맙습니다.

input.txt를 :

zombieland 2009 88 

avatar 2009 178 

watchmen 2009 215 
+0

이상한 결과는 아마도 메모리 주소 일 것입니다. 왜'record * list [1024]'를 쓰는가? – Brian

+0

이것은 정말로 문제는 아니지만'if (list [i] == NULL) break;를 실행하고 다음 줄의 printf 문을 수행하면 프로그램 속도가 빨라집니다. – ciphermagi

+0

포인터의 배열? –

답변

4

당신이 오류는 파일에서 읽은 데이터의 사본을 보관하지 않는 것이 있습니다.

데이터를 읽을 때 해당 데이터를 로컬 변수 temp에 넣습니다. 그런 다음 temp (다른 메모리에 복사)의 다른 위치에 다양한 포인터를 설정합니다. 다른 라인을 읽을 때, 당신은 temp의 내용을 무시하지만 포인터는 여전히 같은 장소 한마디로

step 1 read zombieland 2009 88 
pointers ^  ^^

step 2 read avatar 2009 178 
oldpointers^  ^^
newpointers^ ^^

를 가리 : 새로운 malloc 거라고 메모리에 strtok()의 결과를 복사합니다.

오! 더 이상 필요하지 않을 때 메모리를 free()으로 잊어 버리지 마십시오 (아마도 프로그램이 끝날 때).

+1

정말 고마워요. 포인터를 가리 키지 않고 내용을 복사해야합니다. –

+0

오른쪽! 구조체 멤버를 char 배열로 만들 수 있고 매 단계마다 'malloc'메모리를 피할 수 있습니다. 그러나 어느 쪽이든 당신이 ** 복사 **하는 동안 작동합니다. – pmg

+1

'malloc (sizeof (char) * (strlen (tmp) +1))'확실히 확실히 안전합니다. – ciphermagi

관련 문제