IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

vider le buffer clavier


Sujet :

C

  1. #1
    Expert confirmé
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 4 062
    Points
    4 062
    Par défaut vider le buffer clavier
    Salut!

    Y a t'il stricte équivalence entre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int c;
    while(scanf("%c",&c) && c!='\n' && c!=EOF);
    et:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int c;
    while ((c = getchar()) != '\n' && c != EOF);
    (cette méthode étant la plus élégante).
    Autrement dit entre:
    scanf("%c",&c) et c=getchar() ?

    Merci.
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  2. #2
    Membre expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 851
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 851
    Points : 3 481
    Points
    3 481
    Par défaut
    Est-ce que tu cherches à savoir s'il y a équivalence sémantique ?

    Je pense que c'est équivalent, par contre ça sera beaucoup plus rapide d'utiliser getchar car tu t'affranchies des vérifications de format de scanf
    K

  3. #3
    Membre du Club
    Inscrit en
    Mai 2003
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 99
    Points : 66
    Points
    66
    Par défaut
    bonjour,


    je crois que c est fflush(stdin)

  4. #4
    Membre averti
    Avatar de joellel
    Profil pro
    Inscrit en
    Février 2003
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Février 2003
    Messages : 234
    Points : 338
    Points
    338
    Par défaut
    Citation Envoyé par seriousme
    Salut!

    Y a t'il stricte équivalence entre:
    scanf("%c",&c) et c=getchar() ?

    Merci.
    a priori, oui. Les deux lisent le premier caractère disponible dans le flux stdin.Tu peux toujours regarder ce que fait getchar(), c'est une macro définie dans stdio.h et non une fonction.
    Ceci dit, je ne suis pas du tout sûre que EOF soit chargé dans c.

  5. #5
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625

  6. #6
    Expert confirmé
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 4 062
    Points
    4 062
    Par défaut
    Merci de vos réponses.
    Je veux dire toutes les différences entre ces fonctions.
    Donc:
    -"getchar" plus rapide,
    -problème(?) avec EOF avec "scanf"
    c'est une macro définie dans stdio.h et non une fonction.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    __CRT_INLINE int __cdecl getchar (void)
    {
      return (--stdin->_cnt >= 0)
        ?  (int) (unsigned char) *stdin->_ptr++
        : _filbuf (stdin);
    }
    Ce n'est pas une macro, juste une fonction inline.
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  7. #7
    Membre averti
    Avatar de joellel
    Profil pro
    Inscrit en
    Février 2003
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Février 2003
    Messages : 234
    Points : 338
    Points
    338
    Par défaut
    Citation Envoyé par seriousme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    __CRT_INLINE int __cdecl getchar (void)
    {
      return (--stdin->_cnt >= 0)
        ?  (int) (unsigned char) *stdin->_ptr++
        : _filbuf (stdin);
    }
    Ce n'est pas une macro, juste une fonction inline.
    Ca dépend des implémentations
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    #define getchar()         getc(stdin)

  8. #8
    Membre averti
    Avatar de Foobar1329
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 283
    Points : 387
    Points
    387
    Par défaut
    Citation Envoyé par ankou82
    bonjour,


    je crois que c est fflush(stdin)
    Nonnnn !!!

    Pas portable.

    Pour répondre à la question initiale, %c du scanf matche un caractère, pas un entier, même si ça marche le plus souvent de part la conversion du char * attendu vers le int * donné en argument. Mais cela ne marche pas : le '\n' n'est jamais lu sauf si spécifié dans la directive du format.

    Rappel :

    "Trailing white space (including new-line characters) is left unread unless matched by a directive. The success of literal matches and suppressed assignments is not directly determinable other than via the %n directive."

    C'est possible d'utiliser scanf() pour flusher stdin, mais pour rude boys seulement (XP > 10 ans de C, et encore ...)
    http://groups.google.fr/group/comp.l...0de88382?hl=fr

    La plus belle solution reste
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    int c;
    while ((c = getchar()) != '\n' && c != EOF);
    Pas de scan, de recherche du type attendu en fonction du spécifiateur de format, et de mise à jour de la varaible correspondante passée en argument dans ce cas => getchar() est bien plus efficace.

    Et pas de flush sur l'entree standard avec fflush(), merci pour elle.

    A+

  9. #9
    Membre du Club
    Inscrit en
    Mai 2003
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 99
    Points : 66
    Points
    66
    Par défaut
    hello

    j ai retrouvé ce que j avais trouvé sur le net c etait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void flush(void)
    {
       int c;
     
       #ifdef _WIN32
          fflush(stdin);
       #elif defined(linux)
          while( (c=getchar())!='\n' && c!=EOF ); // lit le buffer jusqu'à ce qu'il soit vide
       #endif
    ca marchait tres bien

  10. #10
    Membre averti
    Avatar de Foobar1329
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 283
    Points : 387
    Points
    387
    Par défaut
    Citation Envoyé par ankou82
    hello

    j ai retrouvé ce que j avais trouvé sur le net c etait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void flush(void)
    {
       int c;
     
       #ifdef _WIN32
          fflush(stdin);
       #elif defined(linux)
          while( (c=getchar())!='\n' && c!=EOF ); // lit le buffer jusqu'à ce qu'il soit vide
       #endif
    ca marchait tres bien
    De quelle source, car le bon programmeur aurait simplement écrit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void flush(void)
    {
        int c;
        while( (c=getchar())!='\n' && c!=EOF ); 
    }
    et ça marche sous Linux, Windows, MacOSX, AIX, Solaris, HP-UX, ce que tu veux qui a un vrai compilateur C et une vraie libc.

    D'autre part, c'est très piégeux, car fflush(stdin), plus que d'être non portable, produit un comportement indéfini d'après la norme. Le fait qu'il soit défini avec l'implémentation de Microsoft est un non-respect de la norme par MS. Comme chez ces derniers ils ont fait de gros efforts au niveau de leur CRT (depuis VC .NET et plus encore pour VC2005, en même temps que de gros progrès par rapport à la norme C++) , il se pourrait bien que fflush(stdin) ne soit plus défini comme auparavant et produise donc un comportement indéfini. Et puis c'est laid toutes c'est directives préprocesseur dans le code, surtout quand il n'y en a pas besoin).

    A+

  11. #11
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par ankou82
    bonjour,


    je crois que c est fflush(stdin)
    Pas de Wi-Fi à la maison : CPL

  12. #12
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par ankou82
    hello

    j ai retrouvé ce que j avais trouvé sur le net c etait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void flush(void)
    {
       int c;
     
       #ifdef _WIN32
          fflush(stdin);
       #elif defined(linux)
          while( (c=getchar())!='\n' && c!=EOF ); // lit le buffer jusqu'à ce qu'il soit vide
       #endif 
    }
    ca marchait tres bien
    Ca aussi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void flush(void)
    {
       int c;
     
       // lit le buffer jusqu'à ce qu'il soit vide
       while( (c=getchar())!='\n' && c!=EOF );
    }
    ou :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    static void purge (FILE * fp)
    {
       int c;
       while ((c = fgetc (fp)) != '\n' && c != EOF)
       {
       }
    }
    Pas de Wi-Fi à la maison : CPL

  13. #13
    Expert confirmé
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 4 062
    Points
    4 062
    Par défaut
    Merci de toutes vos réponses et remarques.
    Donc si on résume:
    -"getchar" plus rapide,
    -getchar plus souple: pas de problème en utilisant des "int" à la place de "char"
    -problème avec EOF avec "scanf"
    -"scanf" "vraie" fonction, getchar tantôt fonction tantôt macro.
    C'est tout?
    Y a t'il d'autres éléments interressant?
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  14. #14
    Expert confirmé
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 4 062
    Points
    4 062
    Par défaut
    Il n'y a vraiment rien d'autre à signaler?
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  15. #15
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par seriousme
    Il n'y a vraiment rien d'autre à signaler?
    Je ne pense pas. J'ai publié une solution basée sur l'expérience et les forums Usenet c.l.c. et f.c.l.c. Je ne pense pas qu'on puisse faire mieux.
    Pas de Wi-Fi à la maison : CPL

  16. #16
    Expert confirmé
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 4 062
    Points
    4 062
    Par défaut
    Pas seulement pour la purge mais plus généralement sur les différences entre "scanf" et "getchar".
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  17. #17
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par seriousme
    Pas seulement pour la purge mais plus généralement sur les différences entre "scanf" et "getchar".
    C'est quoi scanf() ?
    Pas de Wi-Fi à la maison : CPL

  18. #18
    Expert confirmé
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 4 062
    Points
    4 062
    Par défaut
    Pour le problème du EOF:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while(!feof(stdin)&& scanf("%c",&c) && c!='\n');
    ne marche pas.
    En effet ce test:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    char c,c1,c2;
    printf("premier caractere\n");
    scanf("%c",&c1);
    printf("%c %d\n",c1,feof(stdin));
    Si on rentre:
    a^z (ctrl+z)
    affiche:
    a 0
    donc il n'a pas détecté le EOF.
    Pourtant:
    scanf("%c",&c1);/*prend le caractère a, il ne reste que le EOF*/
    feof(stdin);/*regarde si le caractère restant est EOF*/
    où est l'erreur de raisonnement?
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  19. #19
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par seriousme
    Pour le problème du EOF:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while(!feof(stdin)&& scanf("%c",&c) && c!='\n');
    ne marche pas.
    Mais tu sort ça d'où ? feof() ne fait pas ce que tu crois :

    http://emmanuel-delahaye.developpez....s.htm#fichiers

    On t'a déjà donné les solutions qui fonctionnent. Tu cherches quoi exactement ? A réinventer la roue ?
    Pas de Wi-Fi à la maison : CPL

  20. #20
    Expert confirmé
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 4 062
    Points
    4 062
    Par défaut
    Mais tu sort ça d'où ? feof() ne fait pas ce que tu crois :
    le "man" dit:
    La fonction feof teste l'indicateur de fin de fichier concernant le flux pointé par stream
    ^Z simule cette fin de fichier, non?
    Pourquoi n'est t'elle pas détectée?
    On t'a déjà donné les solutions qui fonctionnent
    Ce n'est pas mon but ici.
    Tu cherches quoi exactement ?
    A comprendre, c'est tout.
    A réinventer la roue ?
    Une fois de plus non, la solution du "getchar" est de loin la meilleure.
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Vider le buffer clavier
    Par Lucien63 dans le forum C++
    Réponses: 1
    Dernier message: 15/08/2011, 09h35
  2. vider le buffer clavier
    Par kyuubii_74 dans le forum x86 16-bits
    Réponses: 2
    Dernier message: 20/12/2010, 17h47
  3. [C] Problème pour vider un buffer clavier
    Par mickael777 dans le forum Windows
    Réponses: 7
    Dernier message: 08/11/2007, 17h05
  4. vider le buffer clavier
    Par josmiley dans le forum Général Python
    Réponses: 2
    Dernier message: 09/08/2007, 16h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo