我正在编写一个读取文件并将信息存储在 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/