[c] plantage du program,base 2 donné, surmen un pb de struct

Signaler
Messages postés
11
Date d'inscription
mercredi 28 avril 2004
Statut
Membre
Dernière intervention
27 mars 2006
-
Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
3 juillet 2006
-
jvous explique mon probleme . ce programme est une base de données de recettes . et il plante a la fonction inserer_recette_fin_liste (vers le milieu du progr)
j ai mi un // devant les lignes qui était defectueuse.
en fait chaque recette est constitué d un nom , d un tps , d un facon , et d une liste chainée d ingrédient
et c est au momen de la creation de la liste chainée d ingredient que ca déconne .j arrive a relier la liste a chaque recette.
je pense que le pb vien soit d un pb de pointeur soit d un pb de structur
Please HELP ME
d avance merci

mon programme :

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
# define N 1000

typedef struct ingredient {char nom_ing[N];
char quantite[N];
struct ingredient * ing_suiv;
}ingredient;

typedef struct ingredient * liste_ing;

typedef struct recette { char nom[N];
liste_ing l_ing;
char tps[N];
char facon[N];
struct recette * rec_suiv;
}recette;

typedef struct recette * liste_recettes;

void affiche_ingredient(liste_ing i){
printf(" %s : %d \n",i->nom_ing,i->quantite);
if (i->ing_suiv!=NULL) affiche_ingredient(i->ing_suiv);}


void affiche_recette(liste_recettes l){
printf("\n Nom de la recette : %s \n\n",l->nom);
affiche_ingredient(l->l_ing);
printf("Temps de preparation : %s minutes \n\n",l->tps);
printf(" Instructions : %s \n\n\n",l->facon);
}

void recherche (liste_recettes l, char c[N]){
if (l==NULL) printf(" la recette ne fais pas partie du fichier source \n ");
else if (strcmp(c,l->nom)==0) affiche_recette(l);
else recherche(l->rec_suiv,c);

}

void recherche_selon_nom(liste_recettes l){
char chaine [N];
printf("\n\n\n Ecrivez le nom de la recette que vous souhaitez afficher : ");getchar();gets(chaine);
recherche(l,chaine);
}

void affiche_recette_tps(liste_recettes l,int i){
int j;
if (l==NULL) printf(" \n\n\n\n La recherche est terminee \n\n\n");

else{ j=atoi(l->tps);
if (j==i) {affiche_recette(l);
system("PAUSE");
affiche_recette_tps(l->rec_suiv,i);
}
else affiche_recette_tps(l->rec_suiv,i);
}
}

int rech_tps_mini(liste_recettes l,int i){
int t;
if (l==NULL) {return (i);}
else { t=atoi(l->tps);
if (trec_suiv,t);}
else {rech_tps_mini(l->rec_suiv,i);}}}

void recherche_tps_mini(liste_recettes l){
int u,v;
if (l==NULL)printf(" Le fichier recette est vide \n");
else {u=atoi(l->tps);
v=rech_tps_mini(l,u);
if (vnom_ing,strtok(t,","));
strcpy((*ing)->quantite,strtok(NULL,";"));
(*ing)->ing_suiv=NULL;
creer_ingredient(strtok(NULL,":"),&((*ing)->ing_suiv));
}
else
{
if ((strtok(r,";")!=NULL)&&(*ing!=NULL))
creer_ingredient(t,&((*ing)->ing_suiv));
}

}

void inserer_recette_fin_liste(char a[N],liste_recettes *l) {
char t[N];
liste_ing li;
strcpy(t,a);
if (*l==NULL) {li=NULL;
*l=(liste_recettes)malloc(sizeof(recette));
strcpy((*l)->nom,strtok(a,":"));
strtok(NULL,":")
// creer_ingredient(strtok(strchr(strchr(t,':'),':'),":"),&li);
strcpy((*l)->tps,strtok(NULL,":"));
strcpy((*l)->facon,strtok(strrchr(a,':'),"\n"));
// (*l)->l_ing=li;
(*l)->rec_suiv=NULL;
}
else inserer_recette_fin_liste(a,&((*l)->rec_suiv));
}




int menu(liste_recettes l){
int i,j;

printf(" ==================\n | Projet de C |\n ==================\n\n\n\n\n 1.Recherche de Recette \n\n\n\n 2.Ajout de recette \n\n\n\n 3.Exit\n\n\n\n\n\n");
printf("Faites votre choix 1 , 2 ou 3 : ");scanf("%d",&i);
if ((i!=1)&&(i!=2)&&(i!=3)) {system("cls");
printf("\n\n\n\n Vous n\' avez pas tape le bon chiffre , appuyez sur une touche et recommencez \n\n\n");
system("PAUSE");
system("cls");
menu(l);}
switch(i){
case 1: system("cls");
printf(" \n\n\nRecherche:\n----------\n\n\n 1.selon le nom de la recette \n\n\n 2.selon le temps de preparation \n\n\n 3.selon les ingredients presents dans la recette \n\n\n 4.selon le(s) couple(s) quantite-ingredient \n\n\n 5.Retour \n\n\n\n Faites votre choix : ");scanf("%d",&j);
switch(j){case 1: system("cls");
recherche_selon_nom(l);
system("PAUSE");
system("cls");
menu(l);
break;
case 2:system("cls");
recherche_tps_mini(l);
system("PAUSE");
system("cls");
menu(l);
break;
case 3:break;
case 4:break;
case 5:system("cls");
menu(l);
break;
}
break;
case 2: system("cls");
printf(" \n\n\n\n\n\n 1.Ajouter Recette \n\n\n\n 2.Retour \n\n\n\n\n\n Faites votre choix : ");scanf("%d",&j);
switch(j){case 1:ajout_recette();
system("cls");
printf("/n/n/n/n/n Si vous voulez effectuez une recherche incluant la nouvelle recette , vous devez redemarrer le programme ");
system("PAUSE");
menu(l);
break;
case 2:system("cls");
menu(l);
break;
}
case 3:system("cls");
printf("\n\n\n\n\n\n\n\n\n A B I E N T O T \n\n\n\n\n\n\n\n\n\n\n\n\n");
system("PAUSE");
break;

}
}




main ()
{
FILE *r;
liste_recettes l;
char a[N];
l=NULL;
r= fopen ("recettes.dat", "r");
if (!r) {printf ("*** Impossible d'ouvrir le fichier ***\n");
system("PAUSE");}

else { while(!feof(r)) {

if(fgets(a,10000,r)==NULL){goto begin_loop;}
inserer_recette_fin_liste(a,&l);
;
}} begin_loop:

menu(l);
fclose(r);
}

2 réponses

Messages postés
11
Date d'inscription
mercredi 28 avril 2004
Statut
Membre
Dernière intervention
27 mars 2006

les lignes concernées sont :

creer_ingredient(strtok(strchr(strchr(t,':'),':'),":"),&li);
(*l)->l_ing=li;
Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
3 juillet 2006
8
vérifie au moins le pointeur retourné par les fct strctr, au cas ou.

de plus faire strchr(strchr(t, ':'),':'); ne vas pas de trouver le 2ème ':' de ta châine mais va rester sur le premier.
à la rigueur c'est :
strchr(strchr(t, ':')+1,':');