2014-12-03 4 views
1
card * load_rolodex(FILE *read_file) 
{ 
     int array_index = 0; 
     char line [LINE_MAX]; 

     card *card_array = malloc(sizeof(card) * upper_bound); 

     while (fgets(line, LINE_MAX, read_file)!= NULL) 
     { 
       card_array[array_index].last_name = strtok(line, " "); 
       card_array[array_index].first_name = strtok(NULL, " "); 
       card_array[array_index].phone_number = strtok(NULL, " "); 
       size++; 
       array_index++; 
     } 
     return card_array; 
} 

각 토큰을 구조체 배열의 값에 저장하려고합니다.C : strtok가 이전 배열 값을 덮어 쓰시겠습니까?

0 프랫을 elyn 193 :

나는

LASTNAME의 FIRSTNAME 번호 LASTNAME FIRSTNAME 번호 등

내 출력은 다음과 같다 다음과 같은 형식의 파일에서 읽고 있어요) 760-4405

1 프랫 이블린

2 프랫

3 프랫 velyn 93 velyn (193)760-4405

4 프랫) 760-4405

5 프랫 (193)760-4405

6 프랫 elyn 3 velyn) 760-4405

등 ...

출력이 있어야

012 3,516,

0 아코 나딘 (752)596-6540

1 앨 포드 스카 일러 (635)736-7827

2 앨리슨 로렌스 (475)886-5725

3 알바레즈 콜린 (659) 911- 6629

4 볼 캐드 먼 (328)898-9532

5 발라드 아벨 (853)190-0868

. ..

99 프랫 에블린 (193)760-4405

당신이 볼 수 있듯이, 프랫 에블린 (193)760-4405 내가 읽는 오전 파일의 마지막 라인,

나 ' C에 상당히 새롭고 어떤 것이 잘못되었는지에 대한 어떤 설명도 감사 할 것입니다!

+1

'카드'의 정의가 보입니까? 문제는 문자열을 복사하는 대신 포인터를 할당한다는 것입니다. – mukunda

+1

문자열을 복사하기 위해서는'strcpy()'를 사용해야합니다 (문자열을 복사 할 수있는 충분한 공간이 있는지 확인하십시오); 단순히 포인터를 할당 할 수는 없습니다. 또는'strdup()'를 사용하여 문자열을 복제 할 수 있습니다. 입력이 부정확하게 포맷되어 있기 때문에'strtok()'에서 NULL을 얻지 않았는지 확인해야한다. –

+0

이 사람과 번호가 사실입니까? 그렇다면 여기에서 확실히 제거해야합니다. – alk

답변

2

저장할 문자열을 복제해야합니다. 마찬가지로 ... 코드와

card_array[array_index].last_name = strdup(strtok(line, " ")); 
card_array[array_index].first_name = strdup(strtok(NULL, " ")); 
card_array[array_index].phone_number = strdup(strtok(NULL, " ")); 

는 문자 배열 line 모든 라인을 위해 다시 사용하는 경우와 그 포인터는 card_array 멤버로 설정됩니다. 새로운 행을 읽을 때, 이전 포인터는 또한 새로운 데이터를 얻습니다. 궁극적으로 모든 사람은 마지막 행의 문자를 읽게됩니다.

또한 코드에있는 또 다른 문제점은 로컬 배열 line을 반환하고 있다는 것입니다. 잘못된 것입니다.

+1

문자열을 복제하기 위해'strdup()'를 사용한다면, 돈이 없을 때'free()'를 사용해야한다는 것을 기억하십시오. – dreamlax