C: strtok переопределяет предыдущие значения массива?

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;
}

Я пытаюсь сохранить каждый токен в значения в массиве структур.

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

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

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

0 Праттэлин 193)760-4405

1 Пратт Эвелин

2 Пратт Велин

3 Пратт Велин (193)760-4405

4 Пратт Велин 93)760-4405

5 Пратт (193)760-4405

6 Праттэлин 3)760-4405

и т.д...

Вывод должен быть

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

Как видите, Pratt Evelyn (193)760-4405 — это последняя строка файла, из которого я читаю,

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


person user3566141    schedule 03.12.2014    source источник
comment
Можем ли мы увидеть определение card? Проблема в том, что вы назначаете указатели вместо копирования строк.   -  person mukunda    schedule 03.12.2014
comment
Вы должны использовать strcpy() для копирования строк (и убедиться, что для копирования строк достаточно места); вы не можете просто назначать указатели. Или вы можете использовать strdup() для дублирования строки. Вы должны убедиться, что вы не получаете NULL обратно из strtok(), потому что ввод также неправильно отформатирован.   -  person Jonathan Leffler    schedule 03.12.2014
comment
Являются ли эти лица и числа реальными? Если это так, вы должны обязательно удалить их отсюда.   -  person alk    schedule 05.09.2015


Ответы (1)


Вам нужно продублировать строки, которые вы сохраняете. Нравиться ...

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, что неверно.

person Rohan    schedule 03.12.2014
comment
Помните, что если вы используете strdup() для дублирования строки, вам нужно использовать free(), когда вы не. - person dreamlax; 03.12.2014