Getchar en C

Résolu
darkouna -  
fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,

Voilà j'essaye de récupérer le code ascii des touches entrées au clavier.
Tout va bien quand je tape une touche dans les intervalles [a-z] et [A-Z] mais si j'appuie sur une touche comprise entre 0 et 9, ça me retourne toujours la même valeur "10". Les touches <espace> et <echap> ne marchent même pas.

Mon but c'est de créer une boucle qui s'exécute tant que l'on a pas appuié sur la touche <echap> donc logiquement ça devrait être queque chose de c egenre

Code : C
int test = 0 ;
while(test!=27)
{
printf("\n Veuillez appuyer une touche sur le clavier dans les intervalles [a - z], [A - Z] et [0 - 9].\n En appyuant sur <echap> vous quittez le programme \n");
test=getchar();
printf("%d",test);
}
Configuration: Windows XP Internet Explorer 6.0

6 réponses

  1. KX Messages postés 19031 Statut Modérateur 3 020
     
    Pour valider ton caractères tu appuies sur Entrée (caractère 10) donc ça l'affiche
    De même si tu entres "abc" il t'afficheras 97, puis 98, puis 99, puis 10
    0
  2. darkouna
     
    oui ça je l'avais compris. mais c'est quoi la solution??
    0
  3. KX Messages postés 19031 Statut Modérateur 3 020
     
    Il faut que tu vides le buffer du clavier à chaque tour de boucle, j'ai simplifié le code :
    char c;
    
    while(1)
    {
        printf("char : ");
        c=getchar();
        printf("num : %d\n\n",(int) c);
        
        fflush(stdin); // vide le buffer
    }
    0
    1. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
       
      Salut,

      fflush(stdin); // vide le buffer
      Ce n'est pas un très bonne pratique d'utiliser fflush(stdion)
      Le rôle de fflush c'est de forcer l'écriture des flux.
      On n'écrit pas sur stdin. Sur stdin on lit.

      On risque d'avoir des belles surprises et il me semble que ça ne marche avec tous les compilateurs.
      0
    2. Naji
       
      oui , fflush(stdin) n'est pas recommandée (n'est pas correcte*) . il vaut mieux donc de la remplacer par une boucle qui lit (=efface) tous les caractère restante dans le Buffer jusqu'au la lecture de '\n' :

      while(getchar()!='\n'); //vider buffer
      0
    3. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
       
      oui , fflush(stdin) n'est pas recommandée (n'est pas correcte*)
      Pire que non recommandé, c'est non standard. Cela provoque un comportement indéterminé.
      while(getchar()!='\n'); //vider buffer
      La façon officielle est :
      int c;
      while( (c=getchar()) != '\n' && c!= EOF);
      
      0
    4. KX Messages postés 19031 Statut Modérateur 3 020
       
      Promis, je ne le ferais plus, mais en 3 ans j'ai bien progressé... je ne fais plus de C...
      0
    5. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
       
      Lol KX, on s'en doute. Mais je parlais à Naji qui déterrait le topic ^^.
      0
  4. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Salut,

    tu appuies sur Entrée (caractère 10)
    Le code ASCII 10 correspond au caractère LF (LineFeed) - bref le saut de ligne

    Quand tu tapes une chiffre, test contiendra d'abord ton chiffre mais comme le saute de ligne reste dans le buffer alors il sera lu par le prochain test=getchar()

    Tu pourras essayer par exemple une condition
    if (test==10) getchar();

    Sinon tu peux vider le buffer avec
    while(getchar()!='\n')
        ;


    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. marven23 Messages postés 76 Statut Membre 2
     
    Salut

    Essayez getch() de la bibliotheque conio.h ça vous permet de lire un caractere sans validation par la touche entrer.

    Deux inconvenients malheureusement : vous devez utiliser fflush(stdin) comme avec getchar() et cette bibliotheque conio n'est pas portable.

    @plus...
    0
  7. darkouna
     
    En fait j'utilisais la variable test en tant qu'entier :$
    0