[C] pourquoi n'attend-il pas les données?

Fermé
LunaSev Messages postés 9 Date d'inscription mercredi 4 avril 2007 Statut Membre Dernière intervention 24 mai 2007 - 18 mai 2007 à 14:57
LunaSev Messages postés 9 Date d'inscription mercredi 4 avril 2007 Statut Membre Dernière intervention 24 mai 2007 - 19 mai 2007 à 10:41
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 :

#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?

4 réponses

lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
18 mai 2007 à 15:34
Salut,

Ca marche si tu mets
if (menu == 49)
ou
if (menu == '1')
?!
0
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
18 mai 2007 à 15:54
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.
0
LunaSev Messages postés 9 Date d'inscription mercredi 4 avril 2007 Statut Membre Dernière intervention 24 mai 2007
18 mai 2007 à 17:42
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!
0
LunaSev Messages postés 9 Date d'inscription mercredi 4 avril 2007 Statut Membre Dernière intervention 24 mai 2007
19 mai 2007 à 09:16
Pour ceux que ça pourrait interesser, en mettant un
getchar();
avant
printf("Nom : ");
, ça marche.
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
19 mai 2007 à 09:32
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
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;
}
0
LunaSev Messages postés 9 Date d'inscription mercredi 4 avril 2007 Statut Membre Dernière intervention 24 mai 2007
19 mai 2007 à 10:41
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):

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");
}

0