Getch et la touche "Entrer" en C

Résolu
free -  
 free -
Bonsoir,
pour la préparation d'un TP je me retrouve avec un problème , pour sortir de la boucle il faut appuyer sur la toucher "Entrer" :

   
 while((int)btn != 13 )
    {
        btn = getche();
    }

cependant ,avec ce code il faut appuyer deux fois sur "Entrer" pour en sortir
je sais bien que le problème viens des deux caractères \r\n de la touche entrer , mais comment y remédier ??!

Cordialement

3 réponses

  1. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
     
    Avec ce code il n'y a pas besoin d'appuyer deux fois sur entrée, et il n'y a pas les deux caractères que tu annonces. Lorsque tu appuies sur entrée, seul le caractère '\r' ira dans getche().
    Le problème vient peut-être d'ailleurs.
    Peux-tu en poster davantage ?
    Cdlt,
    2
  2. free
     
    voila le code complet
    #include <stdio.h>
    #include <stdlib.h>
    #include <myconio.h>
    #include <windows.h>
    
    void hide_cursor()
    {
      CONSOLE_CURSOR_INFO cursor = {1, FALSE};
      SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor);
    }
    
    void show_cursor()
    {
      CONSOLE_CURSOR_INFO cursor = {1, TRUE};
      SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor);
    }
    
    void trace_interface()
    {
        int i;
        gotoxy(1,1);
    
        printf("%c",201);
        for(i=1;i<=120-2;i++)
        {
            printf("%c",205);
        }
        printf("%c",187);
    
    
        for(i=2;i<=48;i++)
        {
            gotoxy(1,i);
            printf("%c",186);
            gotoxy(120,i);
            printf("%c",186);
        }
    
        printf("%c",200);
        for(i=1;i<=120-2;i++)
        {
            printf("%c",205);
        }
        printf("%c",188);
    
        gotoxy(1,3);
        printf("%c",204);
        for(i=1;i<=120-2;i++)
        {
            printf("%c",205);
        }
        printf("%c",185);
    
        gotoxy(35,2);
        printf("Application Artisanale De Gestion Comerciale V1.0");
    
    
    }
    
    int show_menu(char menu[10][255])
    {
        int i,min=0,max=0;
        hide_cursor();
        trace_interface();
        int btn;
        for(i=1;i<=10;i++)
        {
            if((int)menu[i][0]!=0)
            {
                max++;
                gotoxy(30,i*2+15);
                printf("%s \n",menu[i]);
            }
        }
    
        int choix=1;
    
        while (btn != 13)
        {
            btn= getch ();
        }
    
    
        show_cursor();
    }
    
    void main()
    {
        int hauteur,largeur;
        system("cls");
        system("mode con LINES=50 COLS=120");
        system("Color 17");
    
        int operation;
    
        char menu[6][255];
    
        strcpy(menu[1],"MENU 1");
        strcpy(menu[2],"MENU 2");
        strcpy(menu[3],"MENU 3");
        strcpy(menu[4],"MENU 4");
        strcpy(menu[5],"MENU 5");
        strcpy(menu[6],"MENU 6");
    
    
    
    
        show_menu(menu);
       // system("cls");
        printf("==>%d",operation);
    }
    
    
    0
    1. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
       
      Je ne vois aucune raison pourquoi il faut appuyer deux fois sur la touche entrée.
      As-tu bien recompilé ton code et confirmes-tu que c'est bien ce code ?
      0
    2. free
       
      oui ! j'ai testé et retesté ! quand je change le 13 par 27 (ESC) ou autre touche , ça marche très bien ! mais pas pour la touche "Entrer" !
      0
    3. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
       
      On va faire un petit test.
      Remplace la boucle par :
      while (btn != 13)
      {
      btn= getch ();
      printf("%d ",btn);
      }
      fflush(stdout);

      D'ailleurs, petite remarque, t'as oublié d'initialiser ta variable btn. Donc quand tu la compares à 13, tu la compares à n'importe quel valeur. Met par exemple : int btn=0;
      Une fois que tu as recompilé, appuie sur la touche entrée et post le résultat que tu obtiens.
      Cdlt,
      0
    4. free
       
      Merci bcp pour votre aide !

      Voila j'ai remplacé par ça :
      while (btn != 13)
          {
          btn= getch ();
          printf("%d ",btn);
          }
          fflush(stdout);
          printf("Sortie de boucle");
      


      kan je clique sur n'importe quel touche , ça affiche son ascii au premier appuie
      puis j'appuie sur entreé une fois , rien ne se passe , deuxieme fois ça affiche l'ascii 13 et " sortie de boucle" ...
      0
    5. free
       
      cependant , j'ai fais un test séparé (sans fonctions ni rien ) ça sors de la boucle ...
      donc ... ça m'embrouille >< !
      0
  3. free
     
    Merci fiddy !! tu m'a beaucoup aidé !
    en fait avec "myconio.h" le problème ne se pose pas quand je l'utilise directement , mais dans ma source pour des raisons que je ne saurais expliquer , ça marche pas ! bref , myconio.h modifie getch() , donc j'ai supprimé les modifications sur getch() et inclus conio.h en + de myconio.h

    problème réglé =)
    ça apprend a ne pas faire confiance a toutes les sources qu'on trouve sur le NET ..
    0
    1. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
       
      ça apprend a ne pas faire confiance a toutes les sources qu'on trouve sur le NET ..
      Ca c'est clair et pas que sur le net. Les livres du commerce contiennent également des erreurs.
      Bonne continuation et à une prochaine sur CCM ;-)))
      0
    2. free
       
      merci encore ;)
      0
    3. Bilow Messages postés 171 Date d'inscription   Statut Membre Dernière intervention   117
       
      C'est vrai, fais toujours attention. Ca fait perdre du temps bêtement ! Quand j'ai lu ton code j'ai pensé à myconio.h, qui n'est pas un header par défaut, alors je te l'ai signalé... ;)
      0
    4. free
       
      merci bcp ^^
      0