[Split] [Erreur de segmentation] [C] [Programmation]

Résolu/Fermé
Aragorn - Modifié par Aragorn19 le 9/05/2016 à 17:08
Aragorn19 Messages postés 6 Date d'inscription lundi 9 mai 2016 Statut Membre Dernière intervention 13 mai 2016 - 13 mai 2016 à 08:08
Bonjour,
Je fais un programme qui me récupère des données d'un fichier .csv, et je split chaque ligne pour mettre ces données dans une structure de données. Quand j’exécute le programme ça fonctionne jusqu'à une certaines lignes de mon csv, et ça affiche : "Erreur de segmentation (core dumped)".

Quelqu'un aurait-il une idée ?
merci.

1 réponse

fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
9 mai 2016 à 18:18
Bonjour,

Probablement une erreur dans ton code...

Cdlt,
0
Aragorn19 Messages postés 6 Date d'inscription lundi 9 mai 2016 Statut Membre Dernière intervention 13 mai 2016
9 mai 2016 à 18:26
Oui, probablement. Mais comme dans mon fichier j'ai 120 ligne, le code marche sur les 89 lignes et par la suite il y a l'erreur.
Merci quand même.
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
9 mai 2016 à 18:36
Le "probablement" était ironique. Il n'y a pas de doute. L'erreur vient de ton code ;-).
Une erreur ne se manifeste pas forcément tout de suite. Il peut se produire dans certains cas et pas dans d'autres.
Pire, un code peut même contenir une erreur et ne jamais planter.

Bref, sans ton code, on ne peut pas t'aider.
0
Aragorn19 Messages postés 6 Date d'inscription lundi 9 mai 2016 Statut Membre Dernière intervention 13 mai 2016
9 mai 2016 à 18:54
C'était pour dire que tu avais raison. Voici le code mais il pique un peut :D

struct souhait_base{
char* planete[6];
};

struct voyageur
{
int mark;
char* nom;
char* prenom;
char* choix_1;
char* choix_2;
souhait choix1;
souhait choix2;
souhait choix3;
souhait choix4;
int priorite;
};


struct liste_base
{
personne pers;
liste* next;
};

typedef struct liste_base* liste;

typedef struct voyageur personne;
typedef struct souhait_base souhait;

char** str_split(char* a_str, const char a_delim)
{
char** result = 0;
size_t count = 0;
char* tmp = a_str;
char* last_comma = 0;
char delim[2];
delim[0] = a_delim;
delim[1] = 0;

/* Count le nombre d'élément à extraire */
while (*tmp)
{
if (a_delim == *tmp)
{
count++;
last_comma = tmp;
}
tmp++;
}

/* Ajouter un espace pour les tokens. */
count += last_comma < (a_str + strlen(a_str) - 1);

/* Ajouter un espace pour le NULL de la fin pour savoir où se termine
  • les résultats*/ count++; result = malloc(sizeof(char*) * count); if (result) { size_t idx = 0; char* token = strtok(a_str, delim); while (token) { assert(idx < count); *(result + idx++) = strdup(token); token = strtok(0, delim); } assert(idx == count - 1); *(result + idx) = 0; } return result;}liste importSouhait(const char* file){ FILE *fichier; char mot[255]; personne p; fichier = fopen(file, "rt") ; if (fichier==NULL) { printf("Ouverture fichier impossible %s !", file); exit(1); } while ( fgets(mot, sizeof(mot), fichier) != NULL ) { char** token; token = str_split(mot, ','); int i=0; if (token) { while (*(token + i)) { p.nom = *(token + i); printf("[%s]\n", p.nom); i++; p.prenom = *(token + i); printf("[%s]\n", p.prenom); i++; p.choix_1 = *(token + i); i++; p.choix_2 = *(token + i); i++; int j; for(j=1; j<7; j++){ p.choix1.planete[j] = *(token + i); i++; } int k; for(k=1; k<7; k++){ p.choix2.planete[k] = *(token + i); i++; } int l; for(l=1; l<7; l++){ p.choix3.planete[l] = *(token + i); i++; } int m; for(m=1; m<7; m++){ p.choix4.planete[m] = *(token + i); printf("[%s]\n", p.choix4.planete[m]); i++; } } printf("\n"); free(token); } } return NULL;}int main() { liste l = NULL; l = importSouhait("mon_fichier.csv"); printf("Hello\n"); return 0;}
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
11 mai 2016 à 17:06
Ton code a mal été posté.
Du coup, cela ne facilite pas la lecture.

struct voyageur {
[...]
souhait ...;
}

Attention, souhait n'est pas encore défini à ce moment. Soit il faut mettre struct souhait, soit mettre le typedef avant la structure voyageur.

struct liste_base {
[...]
personne pers;
}

Attention, personne n'est pas encore définit à ce moment. Il faut mettre le typedef avant la structure liste_base.

p.nom = *(token + i);
printf("[%s]\n", p.nom);

Vu que tu ne te sers pas de p.nom et cie, pourquoi passer par la variable p.nom ? Tu peux directement afficher la variable *(token+i). A noter que tu peux même utiliser token[i].

int main()
Le bon prototype est : int main(void)

Et enfin, le gros problème :
for(j=1; j<7; j++)
{
p.choix1.planete[j] = *(token + i);
i++;

plante est définie comme un tableau de 6 pointeurs sur char. Le 1er élément est : planete[0] et le dernier est planete[5]. Tu ne peux pas utiliser planete[6], sinon plantage.

Pour la prochaine fois. Merci d'utiliser plutôt la balise <code c> et non <code>. Ca sera encore plus lisible (couleur et tout :-)).
Exemple :
<code c>ici tu mets ton code</code>
Et vérifie bien qu'il n'y a pas de problème particulier concernant l'affichage. Si c'est le cas, tu as la possibilité de modifier ton commentaire. Ca sera plus lisible pour nous, et t'obtiendras une réponse plus rapidement.
Cdlt,
0
Aragorn19 Messages postés 6 Date d'inscription lundi 9 mai 2016 Statut Membre Dernière intervention 13 mai 2016 > fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022
Modifié par Aragorn19 le 11/05/2016 à 23:07
Merci ^^.
D'accord, je fais ça maintenant dans le doute :
struct souhait_base{
  char* planete[6];
};
typedef struct souhait_base souhait;
struct voyageur
{
    int  mark;
    char* nom;
    char* prenom;
    char* choix_1;
    char* choix_2;
    souhait choix1;
    souhait choix2;
    souhait choix3;
    souhait choix4;
    int priorite;
};

typedef struct voyageur personne;
struct liste_base
{
    personne pers;
    liste* next;
};

typedef struct liste_base* liste;


char** str_split(char* a_str, const char a_delim)
{
    char** result    = 0;
    size_t count     = 0;
    char* tmp        = a_str;
    char* last_comma = 0;
    char delim[2];
    delim[0] = a_delim;
    delim[1] = 0;

    /* Count le nombre d'élément à extraire */
    while (*tmp)
    {
        if (a_delim == *tmp)
        {
            count++;
            last_comma = tmp;
        }
        tmp++;
    }

    /* Ajouter un espace pour les tokens. */
    count += last_comma < (a_str + strlen(a_str) - 1);

    /*  Ajouter un espace pour le NULL de la fin pour savoir où se termine  les résultats*/    
         count++;    
         result = malloc(sizeof(char*) * count);    
         
         if (result){
                       size_t idx  = 0;        
                       char* token = strtok(a_str, delim);        
                       while (token) {            
                                          assert(idx < count);            
                                          *(result + idx++) = strdup(token);            
                                           token = strtok(0, delim);        
                       }        
                       
                       assert(idx == count - 1);        
                       *(result + idx) = 0;    
          }    
          return result;
}

liste importSouhait(const char* file)
{
    FILE *fichier;
    char mot[255];
    personne p;
    liste listeGenerale = creer();

    fichier = fopen(file, "rt") ;
    if (fichier==NULL)
    {
        printf("Ouverture fichier impossible %s !", file);
        exit(1);
    }
    
    while ( fgets(mot, sizeof(mot), fichier) != NULL )
    {
        char** token;

        token = str_split(mot, ',');
        if (token)
        {
            int i=0;
            while (*(token + i))
            {
                p.nom = *(token + i);
                printf("[%s]\n", p.nom);
                i++;
                p.prenom = *(token + i);
                printf("[%s]\n", p.prenom);
                i++;
                p.choix_1 = *(token + i);
                i++;
                p.choix_2 = *(token + i);
                i++;
                int j;
                for(j=0; j<6; j++){
                    p.choix1.planete[j] = *(token + i);
                    i++;
                }
                int k;
                for(k=0; k<6; k++){
                    p.choix2.planete[k] = *(token + i);
                    i++;
                }
                int l;
                for(l=0; l<6; l++){
                    p.choix3.planete[l] = *(token + i);
                    i++;
                }
                int m;
                for(m=0; m<6; m++){
                    p.choix4.planete[m] = *(token + i);
                    printf("[%s]\n", p.choix4.planete[m]);
                    i++;
                }
                free(*(token + i));
            }
            printf("\n");
            free(token);
        }
    }
    
    return NULL;
}

int main(void) 
{
    liste l = creer();
    l = importSouhait("monfichier.csv");

    return 0;
}


Pour les p.*** c'était pour les stocker dans une liste mais j'ai juste voulu faire des testes.
0