Показать проблему в C с указателем и структурой из значений Excel - PullRequest
0 голосов
/ 05 января 2019

Я столкнулся с проблемой при запуске моей программы. Действительно, я не могу правильно отобразить каждую выбранную переменную из моего файла Excel (правильно закодированный с помощью UTF-8). Этот файл Excel содержит только названия городов. Эти имена хранятся в структурах (Test здесь), которые находятся в моем списке указателей с именем: "test_list". Однако, когда я отображаю эти переменные ранее, они отображаются правильно.

См. Ниже мою упрощенную программу и выход:

#include <stdio.h>
#include <stdlib.h>

typedef struct Test Test;

const nbr_villes = 23;

struct Test
{
    char* nom;
};

Test *init_test(char *nom) {

    Test *test = malloc(sizeof(Test));
    test->nom = nom;

    return test;
}

void fill_test(Test **test_list)
{
    FILE *csv_file = fopen("villes.csv", "r");

    char line[1024];

    // remove header "Ville"
    fgets(line, 0, csv_file);

    for (int i = 0 ; i < nbr_villes ; i++)
    {
        fgets(line, 1024, csv_file);
        char *tmp = strdup(line);
        printf("%s\n", tmp);
        test_list[i] = init_test(tmp);
        free(tmp);
    }
}

int main()
{
    // 23 éléments dans liste de test
    Test **test_list = malloc(nbr_villes * sizeof(struct Test));
    fill_test(test_list);

    for (int i = 0; i < nbr_villes; i++){
        printf("%s\n",test_list[i]->nom);
    }
}

и выход:

(prints of tmp :)

ville

Amiens

Bayonne

Bordeaux

Bourges

Caen

Clermont-Ferrand

Dijon

Grenoble

Le-Mans

Lille

Lyon

Marseille

Metz

Montpellier

Nantes

Nice

Niort

Paris

Reims

Rennes

Strasbourg

Toulouse

(Errors are here : prints in the main loop :)

@f
@f
êf
êf
êf
êf
¿f
¿f
░f
░f
░f
░f
░f
Metz

░f
Rennes

Ïf
Niort

pf
hf
Rennes

Strasbourg

Toulouse

Спасибо за помощь.

1 Ответ

0 голосов
/ 05 января 2019
    char *tmp = strdup(line);
    printf("%s\n", tmp);
    test_list[i] = init_test(tmp);
    free(tmp);

char *, запомненный int Тест , сам запомненный в test_list, освобождается free (tmp)

test->nom = nom; скопируйте указатель, строка не дублируется, вам нужно сделать test->nom = strdup(nom); или просто удалить free(tmp);

Но для меня лучший способ - это позвонить init_test(line) (без дублирования), и strdup выполняется в init_test, потому что он должен знать, что дублирование должно быть выполнено, а не вызывающий

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...