Mon programme a cesseé de fonctionner

Résolu
ouled omar -  
[Dal] Messages postés 6205 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,



voici mon programme, quand je l'execute tout marche bien, et soudain, il cesse de fonctionner, svp, aidez moi pour trouver la solution



#include<stdio.h>
#include<stdlib.h>
#include<string.h>
 struct personne
{
    char* nom_prenom;
    int carte_idendite;
    int numero_telephone;
    int date_acces;
    int CIN;
    char* etat;
    struct personne* next;

};

struct personne* ajouter_personne(int CIN, int date_acces)
{
                    char nom_prenom;
                    int  telephone;
                  printf("ENTRER LE NOM ET LE PRENOM DE LA PERSONNE\n") ;
                    scanf("%s",&nom_prenom) ;

                    printf("ENTRER NUMERO DU TELEPHONE\n") ;
                    scanf("%d",&telephone);

                    struct personne *p=NULL;

                           p=malloc(sizeof(struct personne));
                           p->etat="libre";
                           p->nom_prenom=nom_prenom;
                           p->carte_idendite= CIN;
                           p->numero_telephone= telephone;
                           p->date_acces= date_acces;
                           p->next=NULL;
                           return p;
                    }
int existe(struct personne* head, int CIN)
{
    struct personne* p;
    p=p->next;
    while((p->next!= NULL)||(p->CIN!= CIN))
    {
        p= p->next;
    };
    if(p->next!=NULL)
    {
        return 1;
    }
    else
        {
            return 0;
        };

}
struct personne* recherche_element_personne(struct personne* head,int CIN)
{
    struct personne* p;
    while (existe(head,CIN)!=0)
    {
        p=p->next;
    }
    return p;
}
  int CIN,date_acces;
  struct personne* head;
  struct personne* p;
int main()
{
    head=NULL;
printf("ENTRER CIN\n") ;
scanf("%d",&CIN) ;
printf("DONNERR LA DATE D'ACCEES\n");
scanf("%d", &date_acces);
  if ((head->next)= NULL)
                    {
                        p= ajouter_personne(CIN,date_acces);
                        head->next =p;
                    }
                    else

                    {
                    if(existe(head->next,CIN)==0 && p->next==NULL)
                     {
                        p->next=ajouter_personne(CIN,date_acces);
                        p=p->next;
                     }
                     else
                    {
                        if(strcmp(recherche_element_personne(head,CIN)->etat,"a empruté")==0)
                       {
                           printf("IL FAUT RENDRE LES LIVRES EN AVANTS");
                        }
                       else
                        {
                        recherche_element_personne(head,CIN)->etat="libre";
                        recherche_element_personne(head,CIN)->date_acces=date_acces;
                        };
                    }
                    }

return 0;

}
A voir également:

2 réponses

[Dal] Messages postés 6205 Date d'inscription   Statut Contributeur Dernière intervention   1 105
 
Salut ouled omar,

Ton code est très long, il comporte de nombreuses erreurs.

Tu devrais commencer par un code plus court, tester, vérifier qu'il fait ce qu'il est supposé faire, et seulement après passer à la suite.

La compilation sans erreurs ne garantit pas que ton code soit sans erreurs, surtout en C. Par ailleurs, avec un compilateur comme gcc, si tu compiles avec les warnings (au minimum avec l'option
-Wall
), tu verras que ton compilateur te signale des choses.

Il faut que tu revoies les notions de déclaration et initialisation de pointeur, d'allocation de mémoire et d'usage de chaînes de caractères en C.

En vrac, et sans être exhaustif, voilà les erreurs qui me sautent aux yeux :

Quand tu définis
char* nom_prenom;
, nom_prenom est un pointeur sur char. Pour en faire quelque chose d'utile, tu dois le faire pointer vers une zone de mémoire pouvant accueillir une chaîne de caractères C.

Si tu n'alloues pas cette zone mémoire, le pointeur nom_prenom pointe sur quelque chose d'imprévisible.

Pareil pour
char* etat;


Une fois que tu as alloué de l'espace pour stocker ta chaîne, tu ne peux pas faire
p->etat = "libre";
en C. La copie de chaînes ne fait avec
strcpy()
qui nécessite d'inclure
string.h
.

En C, pour retourner une structure, tu ne ferais pas :

struct personne* ajouter_personne(int CIN, int date_acces)


mais plutôt :

void ajouter_personne(struct personne * p, int CIN, int date_acces)


dans cette fonction ajouter_personne, tu déclares
char nom_prenom;
, c'est à dire que nom_prenom est un char.

Dans ces conditions, tu ne peux pas faire ensuite
scanf("%s", &nom_prenom);
, car
%s
capturera plusieurs caractères.

Dans la fonction existe, tu fais :

struct personne* p;
p = p->next;


Mais comme tu n'as fait de déclarer p comme étant un pointeur et que tu ne l'as pas initialisé pour pointer vers une zone mémoire allouée par ton programme où il y a des données pertinentes, il pointe sur quelque chose d'imprévisible, et la ligne qui suit joue avec cela.


Dal
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
Bonjour [Dal]
S'il fait char *etat; bien sûr qu'il peut faire etat="libre";
C'est si etat était un tableau que cela serait impossible. En revanche dans le cas présent, il ne pourra pas modifier les éléments de la zone pointée par etat.

@omar,
En plus des erreurs remontées par Dal :
Dans ta structure personne, tu as mis char nom_personne; au lieu de char *nom_personne; Du coup le scanf("%s",...) qui suit peut faire planter le programme. De plus, n'oublie pas de faire pointer ton pointeur sur une zone allouée. Donc usage de malloc()/calloc() pour faire ton scanf(). Ou sinon, utilise simplement partout char nom_prenom[32]; Tu n'auras pas d'allocations à faire.

if ((head->next)= NULL)
Attention, cette condition ne sera jamais exécutée. Ici tu affectes NULL à ta variable. Et tu fais un if sur le NULL (false)... L'opérateur de comparaison en C est == (double égal).
0
[Dal] Messages postés 6205 Date d'inscription   Statut Contributeur Dernière intervention   1 105
 
@fiddy : merci de cette précision, tu as raison.
0
ouled omar
 
merci les amis :)
0