[C] pourquoi n'attend-il pas les données?
LunaSev
Messages postés
9
Date d'inscription
Statut
Membre
Dernière intervention
-
LunaSev Messages postés 9 Date d'inscription Statut Membre Dernière intervention -
LunaSev Messages postés 9 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
je dois faire un petit programme, mais je bloque sur un truc surement tout bete mais pourtant bien embêtant!
C'est un programme de gestion de personnel. J'utilise des structures, je dois rentrer nom, prénom, et autres informations dans un fichier.
Quand j'exécute, il passe directement à prenom et n'attend pas que je rentre le nom.
Voici mon programme :
Pouvez-vous m'aider?
PS : quand j'enlève la fonction menu (donc quand je ne demande pas à l'utilisateur de rentrer un chiffre) il marche sans problème, et quand je fais if (menu==1) insererPersonne(personne), ça ne marche pas du tout!!
bizarre, non?
je dois faire un petit programme, mais je bloque sur un truc surement tout bete mais pourtant bien embêtant!
C'est un programme de gestion de personnel. J'utilise des structures, je dois rentrer nom, prénom, et autres informations dans un fichier.
Quand j'exécute, il passe directement à prenom et n'attend pas que je rentre le nom.
Voici mon programme :
#include <stdio.h> #include <stdlib.h> /* Structure contenant la date de naissance*/ typedef struct sDate { int Jour; int Mois; int Annee; }; /* Structure contenant toutes les données d'une personne*/ typedef struct structurePersonne { char Nom[20]; char Prenom[20]; char Sexe[1]; struct sDate Date; char Ident[5]; int nbEnfant; } sPersonne; /* Structure contenant la structure du type sPersonne et la structure du type n*. */ typedef struct n { sPersonne personne; struct n* suivant; } NOEUD; NOEUD* initialiser() { return NULL; } char fmenu() { char a; printf("\nVoulez-vous : \n"); printf("1. Ajouter une personne?\n"); printf("2. Supprimer une personne?\n"); printf("3. Consulter la liste des personnes?\n"); printf("4. Chercher une personne (par nom, prenom, identifiant)?\n"); printf("5. Retourner l'age d'une personne?\n"); printf("6. Modifier les donnees d'une personne?\n"); printf("7. Trier la liste des personnes (selon nom, prenom, identifiant, date de naissance, nb enfant) ?\n"); scanf("%c",&a); return a; } void insererPersonne(sPersonne personne) { FILE * entree; entree = fopen("liste.txt","w"); printf("NOM : "); gets(personne.Nom); printf("PRENOM : "); gets(personne.Prenom); printf("SEXE : "); gets(personne.Sexe); printf("NAISSANCE\n"); printf("JOUR : "); scanf("%d",&personne.Date.Jour); getchar(); printf("MOIS : "); scanf("%d",&personne.Date.Mois); getchar(); printf("ANNEE : "); scanf("%d",&personne.Date.Annee); getchar(); printf("IDENTIFIANT : "); gets(personne.Ident); printf("NOMBRE ENFANT : "); scanf("%d",&personne.nbEnfant); getchar(); fwrite(&personne, sizeof(personne),1,entree); fclose(entree); } int main() { char menu; int choix; menu = fmenu(); NOEUD* debut; debut = initialiser(); sPersonne personne; // if (menu == 1) insererPersonne(personne); system("PAUSE"); }
Pouvez-vous m'aider?
PS : quand j'enlève la fonction menu (donc quand je ne demande pas à l'utilisateur de rentrer un chiffre) il marche sans problème, et quand je fais if (menu==1) insererPersonne(personne), ça ne marche pas du tout!!
bizarre, non?
A voir également:
- [C] pourquoi n'attend-il pas les données?
- Fuite données maif - Guide
- Supprimer les données de navigation - Guide
- Trier des données excel - Guide
- Pourquoi effacer les données d'une application - Guide
- Sauvegarde des données - Guide
4 réponses
Comme le fait remarquer lami20j, tu lis un caractère et non pas un chiffre.
après le scanf il faudrait utiliser atoi pour convertir d'ascii en int.
après le scanf il faudrait utiliser atoi pour convertir d'ascii en int.
quelle erreur stupide!
j'ai changé le format de "menu" en int, puis j'ai essayé avec menu==49 et enfin avec menu=='1', ça ne marche pas mieux qu'avant...
mais c'est déjà une erreur de moins!
merci, j'espère que quelqu'un va trouver!
j'ai changé le format de "menu" en int, puis j'ai essayé avec menu==49 et enfin avec menu=='1', ça ne marche pas mieux qu'avant...
mais c'est déjà une erreur de moins!
merci, j'espère que quelqu'un va trouver!
Pour ceux que ça pourrait interesser, en mettant un
getchar();avant
printf("Nom : ");, ça marche.
Salut,
Oui, c'est vrai que ça marche, toutefois pour être cohérent dans ton programme il faut plutôt la mettre dans la fonction fmenu pour la simple raison que c'est après scanf("%c",&a); qu'un caractère traîne
Oui, c'est vrai que ça marche, toutefois pour être cohérent dans ton programme il faut plutôt la mettre dans la fonction fmenu pour la simple raison que c'est après scanf("%c",&a); qu'un caractère traîne
char fmenu() { char a; printf("\nVoulez-vous : \n"); printf("1. Ajouter une personne?\n"); printf("2. Supprimer une personne?\n"); printf("3. Consulter la liste des personnes?\n"); printf("4. Chercher une personne (par nom, prenom, identifiant)?\n"); printf("5. Retourner l'age d'une personne?\n"); printf("6. Modifier les donnees d'une personne?\n"); printf("7. Trier la liste des personnes (selon nom, prenom, identifiant, date de naissance, nb enfant) ?\n"); scanf("%c",&a); getchar(); return a; }
Je viens de me rendre compte que ça ne marche pas, car les données entrées au clavier ne sont pas enregistrées au bon endroit.
j'ai essayé ton idée, lami (merci, d'ailleurs), mais ça ne marche pas plus (pour l'enregistrement des données, sinon, ça attend bien les données quand il le faut).
J'ai l'impression de revenir au point de départ... super!
edit : voilà mon programme modifié (juste les fonctions interessantes et le programme principal):
j'ai essayé ton idée, lami (merci, d'ailleurs), mais ça ne marche pas plus (pour l'enregistrement des données, sinon, ça attend bien les données quand il le faut).
J'ai l'impression de revenir au point de départ... super!
edit : voilà mon programme modifié (juste les fonctions interessantes et le programme principal):
int fmenu() { int a; printf("\nVoulez-vous : \n"); printf("0. Ne rien faire\n"); printf("1. Ajouter une personne?\n"); printf("2. Supprimer une personne?\n"); printf("3. Consulter la liste des personnes?\n"); printf("4. Chercher une personne (par nom, prenom, identifiant)?\n"); printf("5. Retourner l'age d'une personne?\n"); printf("6. Modifier les donnees d'une personne?\n"); printf("7. Trier la liste des personnes (selon nom, prenom, identifiant, date de naissance, nb enfant) ?\n"); scanf("%d",&a); getchar(); return a; } void insererPersonne(sPersonne personne) { FILE * entree; entree = fopen("liste.txt","a+t"); // getchar(); printf("NOM : "); gets(personne.Nom); printf("PRENOM : "); gets(personne.Prenom); printf("SEXE : "); gets(personne.Sexe); printf("NAISSANCE\n"); printf("JOUR : "); scanf("%d",&personne.Date.Jour); getchar(); printf("MOIS : "); scanf("%d",&personne.Date.Mois); getchar(); printf("ANNEE : "); scanf("%d",&personne.Date.Annee); getchar(); printf("IDENTIFIANT : "); gets(personne.Ident); printf("NOMBRE ENFANT : "); scanf("%d",&personne.nbEnfant); getchar(); fwrite(&personne, sizeof(personne),1,entree); fclose(entree); } int main() { int menu; char continu; int choix; NOEUD* debut; debut = initialiser(); sPersonne personne; do { menu=fmenu(); switch (menu) { case 0 : break; case 1 : insererPersonne(personne); break; case 2 : break; case 3 : break; case 4 : break; case 5 : break; case 6 : break; case 7 : break; default : break; } printf("Voulez-vous continuer? (O pour oui, N pour non)\n"); scanf("%c",&continu); if (continu == 'O') menu=fmenu(); } while (continu == 'O'); // affichage a l'ecran printf("\nNOM : %s",personne.Nom); printf("\nPRENOM : %s",personne.Prenom); printf("\nSEXE : %s",personne.Sexe); printf("\nNAISSANCE"); printf("\nJOUR : %d",personne.Date.Jour); printf("\nMOIS : %d",personne.Date.Mois); printf("\nANNEE : %d",personne.Date.Annee); printf("\nIDENTIFIANT : %s",personne.Ident); printf("\nNOMBRE ENFANT : %d",personne.nbEnfant); //debut = insererEnTete(debut,personne); system("PAUSE"); }