2015-12-03 107 views
1

我正在編寫一個程序,它讀取文件並將信息存儲在char *和char **中。當我添加一個節點時,它似乎覆蓋了我的char **變量(sousCategorie)中已有的內容,但是當我從類中添加某些內容時,它不會這樣做。我不知道它爲什麼覆蓋,並且nouvelElement的大小始終爲2,無論我添加什麼。這裏是我的代碼(我知道我使用全局變量,但這是暫時的):覆蓋鏈表C

#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 - >信息=的malloc(的sizeof(sousCategories)+ 1);似乎是問題,但我嘗試過的一切都不起作用。

謝謝

+1

代碼不能編譯。您需要提供afficherListe()的定義。 – d512

+0

你應該像操縱'categorie'一樣操作'sousCategorie':使用strcpy,strdup等。如果你不容易使用指針,可能首先要做的就是將'sousCategorie'聲明爲'char sousCategorie [ 121] [121];' –

+0

我將它添加到我的文章。謝謝 – roud9

回答

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

你應該在你的問題中加上這個,而不是把它寫成你自己問題的答案。 –

1

你的功能void separerElements(char* ligne, char** info)似乎有未使用的參數,而不是複製到全局變量。

那些全局變量

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

不足以應付什麼是strtok的返回,因爲strtok的內部採用的是靜態緩衝區解析字符串,每次你打電話給你separererElements靜態緩衝區被覆蓋。

categorie只能保存您複製到它的最後一個值。

而是做這樣的事情

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

...

 if (j == 0) 
     { 
      categorie[j] = strdup(element); 
     } 
     else 
     { 
      sousCategories[j] = strdup(element); 
     } 
     ++j; 

或者更好的是實際使用您通過char** info說法,但這是你的電話。