probleme avec getchar
Répondre à la discussion
Affichage des résultats 1 à 10 sur 10

probleme avec getchar



  1. #1
    invite6ae216d1

    Red face probleme avec getchar


    ------

    Bonjour, je veux saisir un entier avec la fonction scanf, puis saisir un caractère avec la fonction getchar sans taper sur la touche "entrer".
    Pour cela j'ai trouver le code cidessous avec quelques modifications.( c'est clair : c sous linux)
    Code:
    #include <stdio.h>
    #include <termios.h>
    #include <unistd.h>
    #include <sys/types.h>
    #include <sys/time.h>
    
    void changemode(int dir)
    {
      static struct termios oldt, newt;
      if ( dir == 1 )
      {
        tcgetattr( STDIN_FILENO, &oldt);
        newt = oldt;
        newt.c_lflag &= ~( ICANON | ECHO );
        tcsetattr( STDIN_FILENO, TCSANOW, &newt);
      }
    
      else
        tcsetattr( STDIN_FILENO, TCSANOW, &oldt);
    }
    
    
    int kbhit (void)
    {
      struct timeval tv;
      fd_set rdfs;
      tv.tv_sec = 0;
      tv.tv_usec = 0;
      FD_ZERO(&rdfs);
      FD_SET (STDIN_FILENO, &rdfs);
      select(STDIN_FILENO+1, &rdfs, NULL, NULL, &tv);
      return FD_ISSET(STDIN_FILENO, &rdfs);
    }
    void main()
    {
    int a,b;
    printf("Donner un entier");
    scanf("%d",&a);
    changemode(1);
    printf("Donner un caractere");
    b=getchar();
    changemode(0);
    printf("a=%d et ASCII(b)=%d",a,b);
    }
    Le problème est que lors de l'execution de ce programme, le programme fait la saisie du premier entier "a" et va ignorer la saisie du deuxième caractère "b".en fait il va affecter b=10 le code ascii de la touche enter. ce que je veux pas.
    Je serais très reconnaissant si quelqun m'aide.

    -----

  2. #2
    Jack
    Modérateur

    Re : probleme avec getchar

    il faut vider le buffer clavier qui contient encore le retour ligne précédent. Sous windows, on peut régler ça par un fflush(stdin), mais ce n'est pas standard.
    la preuve, c'est sans effet sous linux.
    Pour l'instant, tu peux essayer de faire un getchar supplémentaire afin de faire sauter le dernier caractère du buffer, mais c'est de la bricole.

    Il existe de la littérature sur les principes de la lecture clavier sur le net. C'est un sujet plus compliqué qu'il n'y parait.

    A+

  3. #3
    polo974

    Re : probleme avec getchar

    il suffit de "manger" le retour à la ligne dans le scanf:
    Code:
    scanf("%d\n",&a);
    Jusqu'ici tout va bien...

  4. #4
    Jack
    Modérateur

    Re : probleme avec getchar

    d'une manière plus générale: http://c.developpez.com/faq/?page=clavier_ecran

    rubrique: "comment vider le buffer clavier"

    A+

  5. A voir en vidéo sur Futura
  6. #5
    polo974

    Re : probleme avec getchar

    sauf que getchar est bloquant...

    sinon:
    Code:
    ...
            char buf[128];
            printf("Donner un entier: ");
            fgets(buf,127,stdin);
            sscanf(buf,"%d",&a);
            changemode(1);
    ...
    le fgets bouffe d'office le retour à la ligne (et nettoie si on a tapé des bêtises entre le nombre et le retour à la ligne à condition de ne pas trop en mettre...).

    car le truc d'avant ne marche pas toujours...
    Jusqu'ici tout va bien...

  7. #6
    polo974

    Re : probleme avec getchar

    sinon, juste un getchar après le scanf pour manger le vilain newline qui traine...:
    Code:
            scanf("%d",&a);
            getchar();
    Jusqu'ici tout va bien...

  8. #7
    Jack
    Modérateur

    Re : probleme avec getchar

    Citation Envoyé par polo974 Voir le message
    sinon, juste un getchar après le scanf pour manger le vilain newline qui traine...:
    Code:
            scanf("%d",&a);
            getchar();
    C'est également ce que je proposais dans mon message #2

    A+

  9. #8
    Jack
    Modérateur

    Re : probleme avec getchar

    Citation Envoyé par polo974 Voir le message
    sauf que getchar est bloquant...
    Pas d'après la norme en tout cas:
    http://man.cx/getchar%283%29/fr

    A+

    PS: je raconte des co...
    si le buffer est vide, ça bloque effectivement.
    Dernière modification par Jack ; 09/08/2011 à 15h17. Motif: correction

  10. #9
    polo974

    Re : probleme avec getchar

    Citation Envoyé par Jack Voir le message
    C'est également ce que je proposais dans mon message #2

    A+
    Oui, et c'est en cherchant "The solution", que je me suis rappelé que dans une autre vie j'avais eu le même problème et que le getchar() règle à condition qu'il n'y a que le newline à virer (ce qui comme tu l'as dit est un peu bricolo).

    De toute façon, maintenant, les balles sont dans le camp de Faroukking...

    Bref, le mieux est de ne pas jouer avec 2 familles de fonctions différentes (f)scanf et (f)getxxx, et de bien faire les choses (tester le retour du fgets par ex pour en faire un second si besoin... ).
    Jusqu'ici tout va bien...

  11. #10
    invite6ae216d1

    Re : probleme avec getchar

    Bonjour

    D'abord merci pour votre aide.
    En fait moi j'ai essayé d'ajouter un "getchar()" ça fonctionne pour cet exemple seulement mais dans un programme structuré et un peu compliqué c ridicule d'ajouter "getchar()"

    Bon, les deux méthodes que vous m'avez proposé sont utiles.
    la première
    Code:
    char buf[128];
            printf("Donner un entier: ");
            fgets(buf,127,stdin);
            sscanf(buf,"%d",&a);
            changemode(1);
    et la deuxième trouvé dans le lienhttp://c.developpez.com/faq/?page=clavier_ecran
    qui consiste a utliser une methode "clean_stdin" qui consiste a vider le buffer d'entrer. Les deux methodes sont fonctionnelles et ils résolu bien mon probème .
    moi je vais utiliser la deuxième car elle me semble simple à manipuler .

    Merci pour votre aide

Discussions similaires

  1. Réponses: 0
    Dernier message: 26/04/2011, 22h25
  2. "langage c" getch, getche et getchar
    Par invite175953cf dans le forum Logiciel - Software - Open Source
    Réponses: 4
    Dernier message: 11/05/2009, 22h28
  3. Réponses: 10
    Dernier message: 22/03/2009, 11h34
  4. [Blanc] Probleme avec tele Philips avec chassis L01.E
    Par invite7bf023ca dans le forum Dépannage
    Réponses: 2
    Dernier message: 20/03/2009, 19h27
  5. probleme avec vista -> lecture du son avec fichier .mpg
    Par invite7f1547ae dans le forum Logiciel - Software - Open Source
    Réponses: 7
    Dernier message: 23/01/2008, 23h28