Partage
  • Partager sur Facebook
  • Partager sur Twitter

scanf d'un char dans une boucle while

printf s'ecrit 2fois a chaque fois... bizarre !

Sujet résolu
    21 novembre 2007 à 10:02:42

    Bonjour bonjour de bon matin!

    Bon je vous explique mon probleme.. En gros je pose une question à l'utilisateur qui doit repondre le caractere Y ou N. etj'ai mis une boucle while pour que tant que la reponse n'est ni Y ni N il repose la question.. Mais voila, là question se pose 2 fois a chaque fois.

    Voici l'extrait de mon code:

    1. char reponse = 'a';
    2.   int vieMonstre;
    3.   int enleveVie;
    4.   srand (time (NULL));
    5.   vieMonstre = lanceDe(30, 80);
    6.   printf("La vie du monstre vaut %d.\n", vieMonstre);
    7.   while (reponse != 'Y' && reponse != 'N')
    8.   {
    9.   printf("Voulez-vous utiliser votre invocation? (Y ou N)\n");
    10.   scanf("%c", &reponse);
    11.   }
    12.   if (reponse == 'Y')
    13.   {
    14.               printf("Le monstre est ralenti par votre invocation. Vous pouvez vous echapper.\n");
    15.               perso.magicien->invocation = 0;
    16.               return;
    17.   }



    Donc c'est le printf de la ligne 11 qu'ils me posent 2 fois.

    voici le resultat de l'execution:

    Combien de joueurs y a-t-il?
    4
    La vie du monstre vaut 32.
    Voulez-vous utiliser votre invocation? (Y ou N)
    Voulez-vous utiliser votre invocation? (Y ou N)
    h
    Voulez-vous utiliser votre invocation? (Y ou N)
    Voulez-vous utiliser votre invocation? (Y ou N)
    ko
    Voulez-vous utiliser votre invocation? (Y ou N)
    Voulez-vous utiliser votre invocation? (Y ou N)
    Voulez-vous utiliser votre invocation? (Y ou N)
    j
    Voulez-vous utiliser votre invocation? (Y ou N)
    Voulez-vous utiliser votre invocation? (Y ou N)
    N



    Et je vois pas ce que j'ai fait de mal, je me doute qu'il doit lire plus d'un caractere (peut etre aussi le enter apres) mais je sais pas comment faire ..

    Merci de votre aide!!

    Marie ;):)
    • Partager sur Facebook
    • Partager sur Twitter
      21 novembre 2007 à 10:12:17

      fflush(stdin);
      1. do
      2.     {
      3.          printf("Y or N\n");
      4.          fflush(stdin);
      5.          scanf("%c", &reponse);
      6.     } while (reponse != 'Y' && reponse != 'N');

      • Partager sur Facebook
      • Partager sur Twitter
        21 novembre 2007 à 10:21:30

        Trop bien ce truc ! je connaissais pas du tout !

        Ben merci beaucoup hihi c'est magique !!

        Marie ;):D:D
        • Partager sur Facebook
        • Partager sur Twitter
          21 novembre 2007 à 10:26:39

          Citation : guindilla

          Trop bien ce truc ! je connaissais pas du tout !

          Ben merci beaucoup hihi c'est magique !!

          Marie ;):D:D


          Ca vide le buffer du flux d'entrée (si stdin).

          Plus d'infos (man fflush dans google) :
          http://www.linux-kheops.com/doc/man/manfr/man-html-0.9/man3/fflush.3.html
          • Partager sur Facebook
          • Partager sur Twitter
            21 novembre 2007 à 10:29:28

            Citation : guindilla

            Trop bien ce truc ! je connaissais pas du tout !

            Ben merci beaucoup hihi c'est magique !!

            Marie ;):D:D



            cette fonction supprime la memoire, voila con role.
            ton printf se repete deux foix car il lit deux choses : le char (y ou n) que ta entré + la frappe sur le clavier de "entré" :);)
            donc tu dois ajouté fflush(stdin); avant scanf
            • Partager sur Facebook
            • Partager sur Twitter
              21 novembre 2007 à 10:55:38

              Citation : hivenz

              Citation : guindilla

              Trop bien ce truc ! je connaissais pas du tout !

              Ben merci beaucoup hihi c'est magique !!

              Marie ;):D:D


              Ca vide le buffer du flux d'entrée (si stdin).

              Plus d'infos (man fflush dans google) :
              http://www.linux-kheops.com/doc/man/manfr/man-html-0.9/man3/fflush.3.html



              C'est peut-être magique, mais c'est un beau comportement indéfini. Tout peut arriver! On n'a pas le droit d'utiliser fflush() avec un flux entrant, comme par exemple stdin. C'est pas moi qui le dit, c'est la norme. Une manière portable de purger un flux entrant:

              1. void clean_input_stream(FILE *fp)
              2. {
              3.     if (fp != NULL)
              4.     {
              5.         int c;
              6.         while ((c = fgetc(fp)) != '\n' && c != EOF)
              7.         {
              8.         }
              9.     }
              10. }


              A utiliser partout où tu utilises fflush(stdin) qui, je le rappelle, est une utilisation INTERDITE de fflush(). Ton code devient:

              1. char reponse = 0;
              2. /* ... */
              3. while (reponse != 'Y' && reponse != 'N')
              4. {
              5.     printf("Voulez-vous utiliser votre invocation? (Y ou N)\n");
              6.     scanf("%c", &reponse);
              7.     if (reponse != '\n' && reponse != EOF)
              8.     {
              9.         clean_input_stream(stdin);
              10.     }
              11. }


              Thierry
              • Partager sur Facebook
              • Partager sur Twitter
                21 novembre 2007 à 11:26:51

                Citation : hivenz

                oui en effet, je ne savais pas
                je n'utilise jamais scanf mais fgets :)

                http://www.siteduzero.com/tuto-3-11181-1-realiser-des-saisies-securisees-grace-a-fgets.html



                Ca ne change rien au fait qu'il ne faut appeler fflush() sur stdin pour vider le tampon du flux d'entrée standard.

                Thierry
                • Partager sur Facebook
                • Partager sur Twitter
                  21 novembre 2007 à 11:44:04

                  Citation : tc

                  C'est peut-être magique, mais c'est un beau comportement indéfini. Tout peut arriver! On n'a pas le droit d'utiliser fflush() avec un flux entrant, comme par exemple stdin. C'est pas moi qui le dit, c'est la norme. Une manière portable de purger un flux entrant:

                  1. void clean_input_stream(FILE *fp)
                  2. {
                  3.     if (fp != NULL)
                  4.     {
                  5.         int c;
                  6.         while ((c = fgetc(fp)) != '\n' && c != EOF)
                  7.         {
                  8.         }
                  9.     }
                  10. }



                  A utiliser partout où tu utilises fflush(stdin) qui, je le rappelle, est une utilisation INTERDITE de fflush(). Ton code devient:

                  1. char reponse = 0;
                  2. /* ... */
                  3. while (reponse != 'Y' && reponse != 'N')
                  4. {
                  5.     printf("Voulez-vous utiliser votre invocation? (Y ou N)\n");
                  6.     scanf("%c", &reponse);
                  7.     if (reponse != '\n' && reponse != EOF)
                  8.     {
                  9.         clean_input_stream(stdin);
                  10.     }
                  11. }



                  Thierry


                  que est ce que signifie ce code exactement ?
                  ta utilisé une fonction clean_input_stream recoit nu ponteur de type fille.
                  fille c'est quoi ? ...
                  • Partager sur Facebook
                  • Partager sur Twitter
                    21 novembre 2007 à 12:18:30

                    Citation : reckahomis1

                    Citation : tc

                    C'est peut-être magique, mais c'est un beau comportement indéfini. Tout peut arriver! On n'a pas le droit d'utiliser fflush() avec un flux entrant, comme par exemple stdin. C'est pas moi qui le dit, c'est la norme. Une manière portable de purger un flux entrant:

                    1. void clean_input_stream(FILE *fp)
                    2. {
                    3.     if (fp != NULL)
                    4.     {
                    5.         int c;
                    6.         while ((c = fgetc(fp)) != '\n' && c != EOF)
                    7.         {
                    8.         }
                    9.     }
                    10. }



                    A utiliser partout où tu utilises fflush(stdin) qui, je le rappelle, est une utilisation INTERDITE de fflush(). Ton code devient:

                    1. char reponse = 0;
                    2. /* ... */
                    3. while (reponse != 'Y' && reponse != 'N')
                    4. {
                    5.     printf("Voulez-vous utiliser votre invocation? (Y ou N)\n");
                    6.     scanf("%c", &reponse);
                    7.     if (reponse != '\n' && reponse != EOF)
                    8.     {
                    9.         clean_input_stream(stdin);
                    10.     }
                    11. }



                    Thierry


                    que est ce que signifie ce code exactement ?
                    ta utilisé une fonction clean_input_stream recoit nu ponteur de type fille.
                    fille c'est quoi ? ...



                    fp est un pointeur sur un flux ouvert. La réponse aux questions de bases comme celles-là se trouve dans ton livre de C.

                    Thierry
                    • Partager sur Facebook
                    • Partager sur Twitter
                      21 novembre 2007 à 12:33:23

                      dans quel livre ? j'ai jamais trouvé comme ces codes la
                      1. if (reponse != '\n' && reponse != EOF)

                      quel est le role de retour à la ligne et de EOF dans ce code ?
                      1. clean_input_stream(stdin);

                      c'est quoi stdin ? c'est une bibliotheque ? ben j'ai jamias l'utiliser comme ca .
                      bon peut-etre tous cela sont des choses de bases, mais fronchement je les sais pa
                      ou bien si tu as un bon livre qui explique tous ces ptits choses en detail tu peux me le passé ?
                      • Partager sur Facebook
                      • Partager sur Twitter

                      scanf d'un char dans une boucle while

                      × 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