Verification si il'ya une faute dans cette program

Fermé
chdoula22 Messages postés 2 Date d'inscription mercredi 5 février 2014 Statut Membre Dernière intervention 3 mars 2014 - Modifié par jipicy le 3/03/2014 à 23:38
 null - 13 mai 2014 à 13:21
Bonjour,
je veux savoir s'il ya des fautes dans ce program car j'arrive pas a faire l'exécution correctement ( surtt dans l'enregistrement des contacts dans un fichier )
merci d'avance
mon code :
/*************************
 *Répértoire téléphonique*
 *************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/* Les structures utilisées dans ce program */

typedef struct
{ char nom[20];
  char prenom[20];
  char cin[8];
} abonne;

typedef struct
{ int num;
  char rue [25];
  char ville [20];
  char code[4];
} adresse;

typedef struct
{
int numtel;
abonne abonne;
adresse adresse;
}contact ;
int taille ;

/* Prototype des fonctions utilisées dans ce program */
int rechercher (contact* tabcontact);
void ajout_contact(contact* tabcontact);
void modifie_contact(contact* tabcontact,int pos);
void supprime_contact(contact* tabcontact,int pos);
void affiche_tableau(contact*tabcontact1);
void affiche_contact(contact* tabcontact,int pos);
void quitter(contact* tabcontact);

/* Program principal */

int main()
 {
    int a ;
    char x ;
    contact tabcontact [50];
do{

    printf("\t******************************************************************\n");
    printf("\t\t\t Menu Principal \n");
    printf("\t******************************************************************\n");

    printf("\t  1   pour ajouter un nouveau contact \n");
    printf("\t  2   pour afficher un  contact \n");
    printf("\t  3   pour modifier les information d'un contact \n");
    printf("\t  4   pour supprimer un  contact \n");
    printf("\t  5   pour quitter \n");
    printf("\t******************************************************************\n");
    printf("\t\n");
    printf(" \t Veuillez entrer votre choix\n\n") ;


    fflush(stdin);
    x=getchar();



      switch (x)
        {
        case '1' :     {ajout_contact (tabcontact ),affiche_tableau(tabcontact);}  break ;
        case '2' :{  a = rechercher (tabcontact);
                      affiche_contact (tabcontact, a);break;};
        case '3' : { a = rechercher (tabcontact);
                     modifie_contact (tabcontact, a) ; break;} ;
        case '4' : { a = rechercher (tabcontact);
                    supprime_contact (tabcontact, a) ; break;} ;
        case '5' : {quitter(tabcontact);break;}
        default : printf("choix inconnue");
        }

    }while (x=='1' || x=='2'|| x=='3'||x=='4' );
return 0;
}
/* Fonction permettant de quitter le program*/

void quitter(contact* tabcontact)
{int i;

    FILE* fichier =fopen("contact.txt","ab");
    for (i=0 ; i< taille;i++)
    {
        fwrite(&tabcontact[i],sizeof(contact),1,fichier);
    }
    fclose(fichier);
}
/* Fonction permettant d'ouvrir un fichier enregistré*/

void init(contact* tabcontact)
{ FILE*fichier;
contact clt ;
fichier=fopen("contact.txt","rb");
 if (fichier!=NULL)
 {
    while (!feof(fichier))
    {
    fread(&clt,sizeof(contact),1,fichier);
    tabcontact[taille]=clt;
    taille++;
    }
 } else printf("le fichier n'existe pas");
}

/* Fonction permettant d'afficher un contact*/

void affiche_contact(contact* tabcontact,int pos)
{
    printf("\t\n");
    printf( "\tle nom du contact                    \t %s \n   ",tabcontact[pos].abonne.nom);
    printf( "\tle prenom du contact                 \t %s\n  ",tabcontact[pos].abonne.prenom);
    printf( "\tle cin du contact                    \t %s\n  ",tabcontact[pos].abonne.cin);
    printf( "\tle rue du contact est                \t %s\n  ",tabcontact[pos].adresse.rue);
    printf( "\tla ville  du contact est             \t %s\n  ",tabcontact[pos].adresse.ville);
    printf( "\tle code postale du contact est       \t %s\n  ",tabcontact[pos].adresse.code);
    printf( "\tle numero de la maison  est          \t %d\n  ",tabcontact[pos].adresse.num);
    printf( "\tle numéro téléphonique du contact est\t %d\n  ",tabcontact[pos].numtel);
    printf("\t\n");
}

/* Fonction permettant d'afficher le tableau de contact */

void affiche_tableau(contact* tabcontact)
{
    int i ;
    for (i=0;i< taille;i++)
    affiche_contact(tabcontact,i);

}

/* Fonction permettant de rechercher un contact et de rendre son indice de tableau */

int rechercher (contact* tabcontact)
{

char y;
int i;
int num;
char nomm[25];
char prenomm[25];
char cinn[25];

printf( " \t tapez 1 pour lancer une recherche par numéro \t \n ");
printf( "\t tapez 2 pour lancer une recherche par abonnée \t\n");
fflush(stdin);
y=getchar();
switch(y)

 {      case '1' : {printf("donner le numéro \t");
                    scanf("%d",&num);
                    for (i=0;i<taille+1;i++)
                    if (tabcontact[i].numtel == num)
                    return i;
                    else
                    return -1;
                    break;
                    }

        case '2' :
                    {
                    printf("\tdonner le nom du contact\t");
                    scanf("%s",nomm);

                    printf("\tdonner le prénom du contact\t");
                    scanf("%s",prenomm);

                    printf("\tdonner le numero de cin du contact\t\n\n");
                    scanf("%s",cinn);

                    for (i=0;i<taille+1;i++)
                        {
                        if ((strcmp(tabcontact[i].abonne.nom , nomm)==0) && (strcmp(tabcontact[i].abonne.prenom , prenomm)==0)&& (strcmp(tabcontact[i].abonne.cin , cinn)==0))
                        return i;
                        else
                        return -1 ;
                        }
                        break;
                        }
 }
 return -1;
 }

/* Fonction permettant d'ajouter un nouveau contact*/

void ajout_contact(contact* tabcontact)
{    do
    {  printf( "\tintroduire le nom               \t ") ;
       scanf("%s",tabcontact[taille].abonne.nom) ;

       printf( "\tintroduire le prenom             \t") ;
       scanf("%s",tabcontact[taille].abonne.prenom) ;

       printf( "\tintroduire le num de cin         \t") ;
       scanf("%s",tabcontact[taille].abonne.cin);

       printf( "\tintroduire la rue                \t ") ;
       scanf("%s",tabcontact[taille].adresse.rue);

       printf( "\tintroduire la ville              \t ");
        scanf("%s",tabcontact[taille].adresse.ville);

        printf( "\tintroduire le numero de la maison\t ") ;
       scanf("%d",&tabcontact[taille].adresse.num);

       printf( "\tintroduire le code postal         \t ");
       scanf("%s",tabcontact[taille].adresse.code);

       printf( "\tintroduire le numero de telephone \t ") ;
       scanf("%d",&tabcontact[taille].numtel);

      taille ++;
       } while (printf("\n \tvoulez vous ajouter un autre contact O/N \t"),fflush(stdin),getchar()=='O');

}


/* Fonction permettant de modifier un contact enregistré*/

void modifie_contact(contact* tabcontact,int pos)
{      printf( "\tintroduire le nouveau nom\n ") ;
       scanf("%s",tabcontact[pos].abonne.nom) ;

       printf( "\tintroduire le nouveau prenom\n ") ;
       scanf("%s",tabcontact[pos].abonne.prenom) ;

       printf( "\tintroduire le nouveau num de cin\n ") ;
       scanf("%s",tabcontact[pos].abonne.cin);

       printf( "\tintroduire la nouvelle rue\n ") ;
       scanf("%s",tabcontact[pos].adresse.rue);

       printf( "\tintroduire la nouvelle ville\n ");
       scanf("%s",tabcontact[pos].adresse.ville);

       printf( "\tintroduire le nouveau code postal \n");
       scanf("%s",tabcontact[pos].adresse.code);


       printf( "\tintroduire le nouveau numero du maison \n\n") ;
       scanf("%d",&tabcontact[pos].adresse.num);

       printf( "\tintroduire le nouveau numero de téléphone \n\n") ;
       scanf("%d",&tabcontact[pos].numtel);
}

/* Fonction permettant de supprimer un contact */

void supprime_contact(contact* tabcontact,int pos)
{
     int i;
     for (i=pos ; i< taille-1 ;i++ )
     {
      tabcontact[i]= tabcontact[i+1];
      taille-- ;
     }

}





2 réponses

Bonjour,
compile ton programme, tu verras bien si ça marche, le debugger te trouvera les éventuelles fautes. Il sert à ça.
Cordialement.
1
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
12 mai 2014 à 00:20
Salut chdoula22,

Quelques indications générales, parce que ton code est trop long.

Tu devrais créer le fichier en mode texte, et non binaire, et y stocker des chaînes de caractères seulement, même pour les données ayant des types numériques.

Si tu tiens à utiliser des types numériques, il te faudra les sérialiser, par exemple, comme cela : http://troydhanson.github.io/tpl/index.html mais ce n'est vraiment pas nécessaire dans ton projet, à mon sens.

Tes %s dans tes scanf ne vont prendre qu'un mot, alors si à "rue", je tape "rue de la Liberté", tu n'auras que "rue", et "de", ira à "ville", etc. Utilise fgets avec stdin avec l'indication du nombre maximal de caractères à prendre en compte, ou un spécificateur de taille au %s dans ton scanf (par exemple
scanf("%24s", tabcontact[taille].adresse.rue);
).

Tu devrais retirer tes fflush(stdin), ce n'est pas du C standard et ce n'est pas portable.

Pour vider le flux stdin après un scanf, tu fais comme cela :

while((c = getchar()) != '\n' && c != EOF)
		/* discard */ ;


http://c-faq.com/stdio/stdinflush2.html


Dal
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
12 mai 2014 à 07:24
Le %24s ne sélectionne que le premier mot également.
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
12 mai 2014 à 10:32
Oui, au temps pour moi, je l'utilise rarement (au profit de fgets). Il faut donc encore compliquer l'expression de la façon suivante :
scanf("%24[^\n]",tabcontact[taille].adresse.rue);
pour que scanf prenne tous les caractères jusqu'au
'\n'
, à l'exclusion de ce caractère, et dans la limite de 24 caractères.


Dal
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
12 mai 2014 à 13:50
Voui, je conseille également fgets() :-).
0
t'as des overflow dans tout les sens (int overflow et data segment based buffer overflow de ce que j'ai vu à l'arraché). =)
0