NiTrOuS Posted April 6, 2004 Share Posted April 6, 2004 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 Link to comment Share on other sites More sharing options...
Irgoff Posted April 9, 2004 Share Posted April 9, 2004 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). Link to comment Share on other sites More sharing options...
XZombi Posted April 9, 2004 Share Posted April 9, 2004 Ou utilise une variable qui met le \0 à la fin automatiquement, me rappelle plus c'est quoi. Le plus simple est de le mettre manuellement bien sur. Link to comment Share on other sites More sharing options...
NiTrOuS Posted April 12, 2004 Author Share Posted April 12, 2004 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'; } Link to comment Share on other sites More sharing options...
Irgoff Posted April 13, 2004 Share Posted April 13, 2004 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. Link to comment Share on other sites More sharing options...
NiTrOuS Posted April 14, 2004 Author Share Posted April 14, 2004 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 ? Link to comment Share on other sites More sharing options...
XZombi Posted April 14, 2004 Share Posted April 14, 2004 Tu accepte le code ascii correspondant. (8 en décimal ou hex) Link to comment Share on other sites More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.