Когда я пытаюсь просмотреть файл, он перезаписывает массив, в который я пытаюсь сохранить? - PullRequest
0 голосов
/ 08 января 2019
    char * names[10];
    int i = 0;
    char theRow[20];

    while (fgets(theRow, 80 , fp) != NULL) {
        names[i] = theRow;
        i++;
    }

Вывод массива, к которому я пытаюсь сохранить, одинаков в зависимости от последнего элемента.

например файл имеет (hi, I, 2, 3, karl)
тогда массив становится (karl, karl, karl, karl, karl)

Я что-то пропустил или что это может быть?

1 Ответ

0 голосов
/ 08 января 2019

Используя names[i] = nameRow;, вы снова и снова сохраняете один и тот же указатель (на один и тот же блок памяти), но с каждой прочитанной строкой вы перезаписываете содержимое , если этот единственный фрагмент памяти.

Вам необходимо скопировать содержимое, которое вы читаете, в ваш буфер nameRow, прежде чем перезаписать его, а затем на следующей итерации цикла.

names[i] = strdup(nameRow);

Функция strdup выполняет две функции: (1) она резервирует память, достаточно большую для хранения копии nameRow (используя malloc), и (2) затем копирует содержимое.

Это также дает понять, что вам придется free каждую запись копировать позже.

И, хотя он получил широкое распространение, strdup не является частью стандарта C; поэтому, чтобы быть независимым от платформы, вам нужно написать ...

names[i] = malloc(strlen(nameRow)+1);
strcpy(names[i],nameRow);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...