Partage
  • Partager sur Facebook
  • Partager sur Twitter

Vider le buffer clavier

Après kbhit()

Sujet résolu
Anonyme
    3 février 2012 à 21:11:45

    Bonjour à tous, je crée un programme necessitant une boucle, pour l'interrompre l'utilisateur presse une touche puis a le choix entre quitter ou continuer. Pour l'interruption j'utilise kbhit(), pour le choix entre quitter et continuer j'utilise getchar(). Le problème est qu'au moment de la saisie avec getchar(), le caractère entré avec kbhit() est présent dans la saisie. Certes il suffit de l'effacer avec la touche d'effacement mais je voudrais tout de même que le programme soit le plus performant possible. J'ai essayé avec fflush(stdin) mais en vain et j'ai lu sur le SdZ que cette solution donnait un résultat indéfini.

    printf("C:Continuer\nQ:Quitter  ");
    choix=getchar();
    if(choix=='c')
    {}
    if(choix=='q')
        return 0;
    


    Si j'appuie par exemple sur P pour interrompre la boucle ça donne au moment de la saisie avec getchar():

    C:Continuer
    Q:Quitter  p


    Merci de m'éclairer :)
    • Partager sur Facebook
    • Partager sur Twitter
      3 février 2012 à 21:41:00

      Si tu utilises kbhit() (de conio), utilise getch() par la suite, et non getchar qui va attendre que tu appuies sur entrée)
      getch te rend la main après l'appui d'une touche quelconque
      • Partager sur Facebook
      • Partager sur Twitter

      Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

      Anonyme
        3 février 2012 à 21:56:38

        Merci de ta réponse, ça marche mais tout se passe comme si getch() n'était pas bloquante : La boucle se poursuit
        • Partager sur Facebook
        • Partager sur Twitter
          3 février 2012 à 22:06:49

          parce que tu dois avoir des caractères en attente dans le buffer.

          Tu peux vider ton buffer en faisant cette fonction :

          void VideBuffer()
          {
            while(kbhit())
               getch();
          }
          
          • Partager sur Facebook
          • Partager sur Twitter

          Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

          Anonyme
            3 février 2012 à 22:25:56

            Merci ça marche :)
            Tu peux m'expliquer le principe de la fonction VideBuffer() stp ?
            • Partager sur Facebook
            • Partager sur Twitter
              3 février 2012 à 22:33:21

              C'est simple : kbhit me dit "oui" s'il reste du monde dans le buffer. (c'est une file d'attente)
              getch lit (et enlève) la prochaine touche.

              Littéralement, si tu imagines que tu es au cinéma, cette fonction veut dire :

              "Tant qu'il y a des mecs, tu les laisses passer"...
              A la fin, tu es sur qu'il n'y a plus personne.
              • Partager sur Facebook
              • Partager sur Twitter

              Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

              Anonyme
                3 février 2012 à 22:43:08

                Ok, tu veux dire que kbhit() renvoie 1 tant qu'il reste des caractères dans le buffer ? Je croyais qu'elle renvoyait 1 si on pressait une touche o_O
                • Partager sur Facebook
                • Partager sur Twitter
                  3 février 2012 à 22:56:31

                  Les deux sont liés :
                  Si tu appuies sur une touche, elle se met dans le buffer, donc avec kbhit, hop tu la vois.

                  Mais si ton jeu fait un gros calcul, que tu appuies, puis relaches une touche avant la fin du calcul, elle se met dans le buffer, et après, kbhit te dira "oui", car la touche est la, même si entre temps tu as relaché.
                  • Partager sur Facebook
                  • Partager sur Twitter

                  Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

                  Vider le buffer clavier

                  × 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