Aller au contenu

Probleme en C


NiTrOuS

Messages recommandés

Bon j ai un problème avec mon programme:

#include<conio.h>
#include<stdio.h>
#include<string.h>
#define key_up 72
#define key_down 80

int menu_deroulant_client();
int menu_deroulant();
void enreg_fiche_client();
void affiche_fiche_client();
void enreg_fiche_fournisseur();
void affiche_fiche_fournisseur();
void saisie(char*,char*,int);

struct enreg
{
char num[4];
char nom[30];
char prenom[30];
char datenais[11];
char rue[30];
char numero[4];
char codepost[5];
char ville[30];
}; /*Structure de la fiche*/

void main()                    //Fonction principale
{
int i,j;
do
{
 i=menu_deroulant();
 if(i==0)
 {
  do
  {
   j=menu_deroulant_client();
   if(j==0)
   enreg_fiche_client();
   else if(j==1)
   affiche_fiche_client();
  }
  while(j!=4);
}
else if(i==1)
{
 do
 {
  j=menu_deroulant_client();
  if(j==0)
  enreg_fiche_fournisseur();
  else if(j==1)
  affiche_fiche_fournisseur();
 }
 while(j!=4);
}
}
while(i!=4);
}

int menu_deroulant()
{
char tab[5][100]={"Menu client","Menu fournisseur","Menu voiture","Menu vente","Quitter"};
int ancpos,anci,pos,i,touche,max=5;
clrscr();
for(i=0;i<max;i++) /*Affichage du menu au depart*/
{
 gotoxy(12,5+i);
 printf("%s\n",tab[i]);
}
pos=5;
i=0;
do
{
 gotoxy(12,pos);
 highvideo();
 cprintf("%s",tab[i]);
 normvideo();
 touche=getch();
 ancpos=pos;
 anci=i;
 if(touche==0)
 {
  touche=getch();
  if(touche==key_down)
  {
   if(i==max-1)
   {
    pos=5;
    i=0;
   }
   else
   {
    ++pos;
    ++i;
   }
  }
  if(touche==key_up)
  {
   if(i==0)
   {
    pos=9;
    i=max-1;
   }
   else
   {
    --pos;
    --i;
   }
  }
  gotoxy(12,ancpos);
  cprintf("%s",tab[anci]);
 }
}
while(touche!=13);
gotoxy(12,20);
return(i);
}

int menu_deroulant_client()
{
char tab[5][100]={"Enregistrer une fiche","Afficher une fiche","Modifier une fiche","Effacer une fiche","Quitter"};
int ancpos,anci,pos,i,touche,max=5;
clrscr();
for(i=0;i<max;i++) /*Affichage du menu au depart*/
{
 gotoxy(12,5+i);
 printf("%s\n",tab[i]);
}
pos=5;
i=0;
do
{
 gotoxy(12,pos);
 highvideo();
 cprintf("%s",tab[i]);
 normvideo();
 touche=getch();
 ancpos=pos;
 anci=i;
 if(touche==0)
 {
  touche=getch();
  if(touche==key_down)
  {
   if(i==max-1)
   {
    pos=5;
    i=0;
   }
   else
   {
    ++pos;
    ++i;
   }
  }
  if(touche==key_up)
  {
   if(i==0)
   {
    pos=9;
    i=max-1;
   }
   else
   {
    --pos;
    --i;
   }
  }
  gotoxy(12,ancpos);
  cprintf("%s",tab[anci]);
 }
}
while(touche!=13);
gotoxy(12,20);
return(i);
}

void enreg_fiche_client()    /*Fonction d enregistrement d un client*/
{
 struct enreg fiche;
 int i,j;
 char autorise[10]="0123456789",chaine[30];
 FILE *f;
 f=fopen("client.dat","wb"); /*Ouverture en ‚criture*/
 if (f==NULL)
  printf("Impossible d ouvrir le fichier");
 else
 {
  for(i=0;i<1;i++) /*Lecture de la fiche*/
  {
   fflush(stdin);
   clrscr();
   printf("\nNum‚ro du client (4 digits): ");
   saisie(chaine,autorise,4);
   strcpy(fiche.num,chaine);
   printf("\nNom: ");
   scanf("%s",fiche.nom);
   printf("\nPrenom: ");
   scanf("%s",fiche.prenom);
   printf("\nDate de naissance: ");
   scanf("%s",fiche.datenais);
   fflush(stdin);
   printf("\nAdresse\n\nRue: ");
   gets(fiche.rue);
   printf("\nNumero: ");
   scanf("%s",fiche.numero);
   printf("\nCode postal: ");
   scanf("%s",fiche.codepost);
   printf("\nVille: ");
   scanf("%s",fiche.ville);
   fwrite(&fiche,sizeof(fiche),1,f);
  }
 fclose(f);
}
}

void affiche_fiche_client()            /*Fonction d affichage d une fiche*/
{
struct enreg fiche;
int i;
FILE *f;
f=fopen("client.dat","rb"); /*Ouverture en lecture*/
if(f==NULL)
 printf("Le fichier n existe pas");
else
{
 fread(&fiche,sizeof(struct enreg),1,f);
 while(!feof(f))
 {
  printf("\nLe numero du client est: %s",fiche.num);
  printf("\nLe nom du client est: %s",fiche.nom);
  printf("\nLe prenom de client est: %s",fiche.prenom);
  printf("\nLa date de naissance du client est: %s",fiche.datenais);
  printf("\n\nAdresse du client\n\nRue: %s",fiche.rue);
  printf("\nNumero: %s",fiche.numero);
  printf("\nCode postal: %s",fiche.codepost);
  printf("\nVille: %s",fiche.ville);
  fread(&fiche,sizeof(fiche),1,f);
 }
 fclose(f);
}
getch();
}

void enreg_fiche_fournisseur()    /*Fonction d enregistrement d un fournisseur*/
{
 struct enreg fiche;
 int i,j;
 FILE *f;
 f=fopen("fourniss.dat","wb"); /*Ouverture en ‚criture*/
 if (f==NULL)
  printf("Impossible d ouvrir le fichier");
 else
 {
  for(i=0;i<1;i++) /*Lecture de la fiche*/
  {
   fflush(stdin);
   clrscr();
   printf("\nNum‚ro du fournisseur (4 digits): ");
   scanf("%s",fiche.num);
   printf("\nNom: ");
   scanf("%s",fiche.nom);
   printf("\nPrenom: ");
   scanf("%s",fiche.prenom);
   printf("\nDate de naissance: ");
   scanf("%s",fiche.datenais);
   fflush(stdin);
   printf("\nAdresse\n\nRue: ");
   gets(fiche.rue);
   printf("\nNumero: ");
   scanf("%s",fiche.numero);
   printf("\nCode postal: ");
   scanf("%s",fiche.codepost);
   printf("\nVille: ");
   scanf("%s",fiche.ville);
   fwrite(&fiche,sizeof(fiche),1,f);
  }
 fclose(f);
}
}

void affiche_fiche_fournisseur()            /*Fonction d affichage d une fiche*/
{
struct enreg fiche;
int i;
FILE *f;
f=fopen("fourniss.dat","rb"); /*Ouverture en lecture*/
if(f==NULL)
 printf("Le fichier n existe pas");
else
{
 fread(&fiche,sizeof(struct enreg),1,f);
 while(!feof(f))
 {
  printf("\nLe numero du fournisseur est: %s",fiche.num);
  printf("\nLe nom du fournisseur est: %s",fiche.nom);
  printf("\nLe prenom de fournisseur est: %s",fiche.prenom);
  printf("\nLa date de naissance du fournisseur est: %s",fiche.datenais);
  printf("\n\nAdresse du fournisseur\n\nRue: %s",fiche.rue);
  printf("\nNumero: %s",fiche.numero);
  printf("\nCode postal: %s",fiche.codepost);
  printf("\nVille: %s",fiche.ville);
  fread(&fiche,sizeof(fiche),1,f);
 }
 fclose(f);
}
getch();
}

void saisie(char *string,char *autorised, int l)
{
int i=0;
char c;
do
{
 c=getch();
 if(strchr(autorised,c)!=NULL)
 {
  printf("%c",c);
  string[i]=c;
  i++;
  }
 }
while((c!='\r')&&(i<l));
string[i]='\0';
}

Le problème, c est que quand je suis dans ma fonction void enreg_fiche_client et que je veux enregistrer un numero de client comprenant 4 digits, je passe par une fonction de verification de saisie (pour pas qu on rentre des lettres).

Cette fonction marche très bien (void saisie) mais le probleme c est que quand je veux copier le résultat dans fiche.num, il me copie aussi fiche.nom, alors que ce n est pas demandé...

Si vous pouviez m eclaircir la voie parce que la je rame depuis des heures merci

Lien vers le commentaire
Partager sur d’autres sites

strcpy, comme son nom l'indique, copie des strings. La fin d'une string est identifiée par le caractère 0 (zéro, '\0'). Ta structure num contient 4 chiffres, mais pas de fin de chaine ; le strcpy va copier TOUS les caractères qu'il trouve jusqu'au prochain '\0'. C'est pourquoi ton champ suivant est également copié.

Si tu veux stocker 4 numéros dans une chaine de caractères, ton champ num doit être de taille 5 (4 numéros + 1 caractère de fin de chaine).

Donc, si tu veux utiliser les fonctions strxxx (telle strcpy), augmente la taille de tes champs d'un caractère et finit tes données par un zéro binaire.

Sinon, utilise les fonctions memxxx (telle memcpy).

Lien vers le commentaire
Partager sur d’autres sites

mais normalement a la fin de ma fonction saisie je l ai mis ...

void saisie(char *string,char *autorised, int l)
{
int i=0;
char c;
do
{
c=getch();
if(strchr(autorised,c)!=NULL)
{
 printf("%c",c);
 string[i]=c;
 i++;
 }
}
while((c!='\r')&&(i<l));
string[i]='\0';
}

Lien vers le commentaire
Partager sur d’autres sites

Oui mais comme ta variable est trop petite, ton '\0' est écrit sur le premier caractère de fiche.nom. Ton '\0' est donc écrasé lorsque tu saisis le nom.

Pour le vérifier, tu peux faire un printf() de ton fiche.num juste après l'avoir entré, et refaire un printf() de fiche.num une fois que tu as saisi le fiche.nom.

Lien vers le commentaire
Partager sur d’autres sites

oui tu avais raison

bon j ai une question urgente j ai besoin d accepter le caractère de retour dans ma fonction saisie pour pouvoir effacer des caractères mal entrés ...

comment puis je faire ???

Donc j ai par exemple ma fonction saisie qui verifie si les chiffres sont bien 0123456789 mais si le gars veut effacer un mauvais caractère il ne peut avec le backreturn comment faire ?

Lien vers le commentaire
Partager sur d’autres sites

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...