c - 覆盖链表 C

标签 c list file

我正在编写一个读取文件并将信息存储在 char* 和 char** 中的程序。当我添加一个节点时,它似乎会覆盖我的 char** 变量 (sousCategorie) 中已有的内容,但是当我从类别中添加内容时它不会这样做。我不知道为什么它会覆盖并且 nouvelElement 的大小始终为 2,无论我添加什么。这是我的代码(我知道我使用的是全局变量,但这是临时的):

#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>

typedef struct element element;
struct element
{
    int val;
    char* valeur;
    char** information;
    struct element *nxt;
};

typedef element* liste_s;


FILE* ouvrirFichier(char* nomFichier);
liste_s ajouterEnTete(liste_s liste, char** tableau);
void separerElements(char* ligne, char** info);
void afficherListe(liste_s l);

char* sousCategories[121];
char categorie[121];


int main(int argc, char **argv)
{
    liste_s ma_liste1 = NULL;
    FILE* fichier = NULL;
    char* elementSepares[121];
    char* info[121];


    fichier = ouvrirFichier(argv[1]);
    char tableau[121];
    int i = 0;

    while (fgets(tableau, 121, fichier))
    { 
          separerElements(tableau, info);
          ma_liste1 = ajouterEnTete(ma_liste1, info);
    }
    afficherListe(ma_liste1);

    return 0;
}


FILE* ouvrirFichier(char* nomFichier)
{
   FILE* fichier = NULL;
   fichier = fopen(nomFichier, "r");
   if (fichier == NULL) // Le fichier n'a pu être ouvert
   {
       perror("Erreur d'ouverture du fichier d'entrée ");
       exit(1);
   }
   return fichier;    
}




void separerElements(char* ligne, char** info) 
{
    char separateurs[] = "[]";
    char* element;
    int j = 0;
    for (element = strtok(ligne, separateurs); element; element = strtok(NULL, separateurs))
    {
         if (strcmp(element, " ") != 0 && strcmp(element, "\n") != 0)
        {
            if (j == 0)
            {
                strcpy(categorie, element);
                j++;
            }
            else
            {
                sousCategories[j] = element;
            }
        }
    }
}




liste_s ajouterEnTete(liste_s liste, char** tableau)
{
    int i = 0;
    element* nouvelElement = malloc(sizeof(element) + 1);
    nouvelElement -> information = malloc(sizeof(sousCategories) + 1); // This is probably here. Strdup() will do a seg fault

    nouvelElement->valeur = strdup(categorie);


    for(i = 0; i <= sizeof(sousCategories) / sizeof(sousCategories[i]); i++)
    {   
        nouvelElement -> information[i] = sousCategories[i];
    }

    nouvelElement->nxt = liste;

    return nouvelElement;
}

void afficherListe(liste_s liste)
{ 
    liste_s l = liste; 
    int i = 0;
    while (l != NULL)
    {
        printf("%s\n", l->valeur);
        for(i = 0; i <= sizeof(l -> information) / sizeof(l -> information[0]); i++)
        {
            printf("-- %s\n", l -> information[i]);
        }
        l = l->nxt;
    } 
 }

行 nouvelElement -> information = malloc(sizeof(sousCategories) + 1);似乎是问题所在,但我尝试过的一切都不起作用。

谢谢

最佳答案

这里是:

void afficherListe(liste_s liste)
{
    liste_s l = liste; 
    int i = 0;
    while (l != NULL)
    {
        printf("%s\n", l->valeur);
        for(i = 0; i <= sizeof(l -> information) / sizeof(l -> information[0]); i++)
        {
            printf("-- %s\n", l -> information[i]);
        }
        l = l->nxt;
    }
}

关于c - 覆盖链表 C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34057310/

相关文章:

python - 在 Python 中的列表中查找非零数的第一个实例

java.io.file 正在变成//变成/?

Java - jackson 到一个文件

c++ - 为嵌入式 C/C++ 项目构建系统

c# - 添加对列表 c# 结构的引用

Python 字符串作为长数字

python - 如何忽略csv文件中的空白行

c++ - 单词的 SQL 哈希表

c - 声明二维数组的程序

c - 带有字符串的结构,包括适当的内存管理