Getch et la touche "Entrer" en C

Résolu/Fermé
free - 2 mars 2011 à 22:52
 free - 3 mars 2011 à 22:43
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

fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
2 mars 2011 à 23:07
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
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
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
3 mars 2011 à 14:59
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
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
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
3 mars 2011 à 21:35
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
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
cependant , j'ai fais un test séparé (sans fonctions ni rien ) ça sors de la boucle ...
donc ... ça m'embrouille >< !
0
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
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
3 mars 2011 à 22:33
ç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
merci encore ;)
0
Bilow Messages postés 1022 Date d'inscription samedi 21 août 2010 Statut Membre Dernière intervention 2 août 2015 117
3 mars 2011 à 22:41
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
merci bcp ^^
0