Partage
  • Partager sur Facebook
  • Partager sur Twitter

[C] Bug d'un programme, cause inconnue

    16 février 2006 à 9:26:40

    Salut à tous

    Je bosse actuellement sur un programme 'repertoire' qui liste les contacts qu'on ajoute dans un fichier 'contacts.rep'.

    Le programme marche sans aucun problème lorsque je fais simplement 'ajouter contact -> voir tous les contacts', mais quand j'implémente un choix au début (1. Ajouter un contact / 2. Voir les contacts), j'ai un petit problème : quand je choisis "Ajouter un contact" en tapant 1, ça lance bien les instructions du if correspondant, mais ça me met
    Nom du contact : Prenom du contact : (là je peux taper)
    Adresse du contact :


    Après, ça marche, mais pourquoi ce bug avec le nom du contact ?

    Voici mon code :

    #include <stdio.h>
    #include <stdlib.h>

    struct Contacts {
           char Nom;
           char Prenom;
           char Adresse;
           char Telephone;
           char Age;
           };

    int main(int argc, char *argv[])
    {
     
      struct Contacts contact;
      int choix;
      char caractere = 'a';
      FILE* fichier = NULL;

      printf("Que voulez vous faire ? \n");
      printf("1. Ajouter un contact \n");
      printf("2. Voir mes contacts \n");
     
      choix = getchar();
     
      if (choix == '1') {
     
      fichier = fopen ( "contacts.rep", "a+");
     
      if (fichier != NULL) {
                 
                  printf("Nom du contact : ");
                  while (contact.Nom != '\n') {
                        contact.Nom = getchar();
                        fputc(contact.Nom, fichier);
                        }
                  printf("Prenom du contact : ");
                  while (contact.Prenom != '\n') {
                        contact.Prenom = getchar();
                        fputc(contact.Prenom, fichier);
                        }
                  printf("Adresse du contact : ");
                  while (contact.Adresse != '\n') {
                        contact.Adresse = getchar();
                        fputc(contact.Adresse, fichier);
                        }
                  printf("Telephone du contact : ");
                  while (contact.Telephone != '\n') {
                        contact.Telephone = getchar();
                        fputc(contact.Telephone, fichier);
                        }
                  printf("Age du contact : ");
                  while (contact.Age != '\n') {
                  contact.Age = getchar();
                  fputc(contact.Age, fichier);
                  }
                 
                  fputc('\n', fichier);
                 
                  fclose(fichier);
                 
                  }
                 
      else if (fichier == NULL) {
           
           printf("Erreur dans l'ouverture du fichier ! \n");
           printf("Le programme va maintenant s'arreter. \n");
           
           }
     
       
        }
     
      else if (choix == '2') {
     
      fichier = fopen("contacts.rep", "r");
     
      if (fichier != NULL) {
     
      while (caractere != EOF) {
            caractere = fgetc(fichier);
            printf("%c", caractere);
            }
         
      fclose(fichier);   
     
      }
     
      else if (fichier == NULL) {
           printf("Erreur dans l'ouverture du fichier ! \n");
           printf("Le programme va maintenant s'arreter. \n");
           }
           
      }
     
      else {
           printf("Choix non pris en compte \n");
           }
     
      return 0;
    }



    Merci d'avance de votre aide.

    ++
    • Partager sur Facebook
    • Partager sur Twitter
      16 février 2006 à 9:41:35

      Rajoutes un getchar(); après choix = getchar(); et ça marche. :p
      • Partager sur Facebook
      • Partager sur Twitter
        16 février 2006 à 9:45:08

        Met plutot scanf("%c", &choix);, ou alors un fflush(stdin) après le getchar, mais c'est un peu plus gore. (de manière générale il ne faut pas mixer les scanf, qui sont de "l'entrée formatée", et les fgets/getchar, qui sont de l'entrée brute)
        • Partager sur Facebook
        • Partager sur Twitter
          16 février 2006 à 12:10:24

          Avec le scanf ça ne marche pas, par contre en rajoutant un getchar(); ça marche o_O

          Par contre, je viens de me rendre compte que j'ai un autre problème :\
          Quand je choisis "2. Voir mes contacts", le fichier ne s'ouvre pas, et le texte d'erreur est renvoyé :(
          • Partager sur Facebook
          • Partager sur Twitter
            16 février 2006 à 12:26:27

            fflush(stdin) a un comportement indéfini, comment oses-tu dire une chose pareille bluestorm ? :p

            Tenez, rz0 m'a pondu ça pour lire un caractère et vider le buffer hier :
            scanf("%c%*[^\n]%*c", &c)

            Mix d'expression régulière et de scanf. Cherchez pas à comprendre comment ça marche, ça marche ^^
            • Partager sur Facebook
            • Partager sur Twitter

            If you'd like to join us, read "How do we work at OpenClassrooms"! :)

              16 février 2006 à 12:30:32

              Hum, ça ne vide pas le buffer mais ça lit un caractère et saute les caractères qui suivent jusqu'à la prochaine ligne ; ce qui est en général le comportement voulu dans une application interactive.
              • Partager sur Facebook
              • Partager sur Twitter
                16 février 2006 à 15:39:56

                Bah le * derrière le % semble signifier qu'on ne souhaite pas stocker la variable.
                %[^\n] c'est la méthode standard pour lire tout les char jusqu'à un \n, et le %c final c'est pour le \n (final).
                • Partager sur Facebook
                • Partager sur Twitter
                  16 février 2006 à 16:00:02

                  Je dis peut-être une bêtise, mais ce serait pas plus facil en cpp ce prog?
                  • Partager sur Facebook
                  • Partager sur Twitter
                    16 février 2006 à 16:06:30

                    Pour revenir sur le problème initial, (car normalement scanf("%*c"); ca doit suffire ^^ ou un truc dans le genre)

                    Il semble que ta déclaration de données dans ta structure ne soit pas cohérente avec ce que tu souhaites y stocker !

                    Tu veux stocker un "nom" dans un simple "char"... au mieux, tu n'auras que la première lettre qui a été entrée...

                    Edit : le scanf("%d", &choix); semble prendre aussi le \n en compte... donc un petit scanf("%*c"); juste après est suffisant pour que ca marche à peut près correctement :)
                    • Partager sur Facebook
                    • Partager sur Twitter
                    Anonyme
                      16 février 2006 à 18:43:55

                      Citation


                      Je dis peut-être une bêtise, mais ce serait pas plus facil en cpp ce prog?


                      A mon avis, c'est a peu près aussi facile en C qu'en C++ (comme pas mal de programmes, enfait). Le code sera juste organisé différement (et utilisera la syntaxe du Cpp bien sur : )
                      • Partager sur Facebook
                      • Partager sur Twitter
                        16 février 2006 à 20:36:45

                        Avec le truc de rz0 j'ai le même bug qu'au départ :S

                        Et j'ai toujours pas résolu le bug qui fait que le fichier ne s'ouvre pas :(
                        • Partager sur Facebook
                        • Partager sur Twitter

                        [C] Bug d'un programme, cause inconnue

                        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                        • Editeur
                        • Markdown