2014-12-03 2 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; 
} 

Я пытаюсь сохранить каждый токен в значениях в массиве struct.C: strtok переопределяет предыдущие значения массива?

Я чтение из файла в следующем формате

номер Фамилия Имя Фамилия Имя номер и т.д ..

Мой выход следующим образом:

0 Pratt Elyn 193) 760-4405

1 Pratt Evelyn

2 Пратт velyn

3 Pratt velyn (193)760-4405

4 Pratt velyn 93) 760-4405

5 Pratt (193)760-4405

6 Пратт Elyn 3) 760-4405

и т.д ...

выход должен быть,

0 Акоста Надин (752)596-6540

1 Олфорд Скайлер (635)736-7827

2 Эллисон Лоуренс (475)886-5725

3 Альварес Колин (659) 911- 6629

4 шарика Cadman (328)898-9532

5 Ballard Абель (853)190-0868

. ..

99 Pratt Эвелин (193)760-4405

Как вы можете видеть, Pratt Эвелин (193)760-4405 последняя строка файла Читаю с,

Я m довольно новичок в C, и любое объяснение относительно того, что происходит неправильно, будет оценено!

+1

Можем ли мы определить определение 'card'? Проблема в том, что вы назначаете указатели вместо копирования строк. – mukunda

+1

Вы должны использовать 'strcpy()' для копирования строк (и убедитесь, что для копирования строк достаточно места); вы не можете просто назначить указатели. Или вы можете использовать 'strdup()' для дублирования строки. Вы должны проверить, что вы не получите NULL обратно из 'strtok()', потому что ввод также неправильно отформатирован. –

+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

Смежные вопросы