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 :

Vérif-Saisie-Clavier! [Débutant(e)]


Sujet :

C

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 89
    Points : 108
    Points
    108
    Par défaut Vérif-Saisie-Clavier!
    Bonjour !

    Un petit stress Là, avec la vérification de saisie... et de boucle infini...

    frustrant...

    Je suis au tout début de l'apprentissage du C, sur un programme tout simple, style entrez a, b, c puis vérif et divers trucs... pour la vérif j'ai ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    do
    {
    printf("Entrez b : ");
    saisie=scanf( "%lg%*c" ,&b);
    fflush(stdin);
    }
    while(!saisie);
    et Quand je compile ça sous Linux... et que j'entre une mauvaise entrée... style mauvais type... ça part dans une boucle infini... comme si le clavier n'était pas vidé...

    où,j'ai ratté un truc...

    Vous avez une idée du Bug??? moi j'ai du mal...

  2. #2
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Un premier bug qui saute aux yeux, c'est l'usage de fflush() avec stdin qui engendre un comportement indéfini. fflush() ne doit pas être utilisé avec un flux entrant.

    Voici la solution que j'utiliserais à base de fgets():

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    void fclean(char *tampon, FILE *fp);
     
    int main(void)
    {
        double b = 0.0;
        char tampon[15] = "";
        char *pend = NULL;
     
        do
        {
            printf("Entrez b: ");
            /* -tc- necessaire pour forcer l'affichage de l'invite */
            fflush(stdout);
     
            if (fgets(tampon, sizeof tampon, stdin) != NULL)
            {
                fclean(tampon, stdin);
                b = strtod(tampon, &pend);
            }
        }
        while(*pend != '\0');
     
        printf("Le nombre b vaut: %.2f\n", b);
     
        return EXIT_SUCCESS;
    }
     
    /* -tc- elimine le caractere de fin de ligne saisie par fgets() et purge le
     *  flux d'entree standard si necessaire (saisie tronquee). Pour plus de 
     *  details, voir les archives du forum C.
     */
    void fclean(char *tampon, FILE *fp)
    {
        if (tampon != NULL && fp != NULL)
        {
            char *pc = strchr(tampon, '\n');
     
            if (pc != NULL)
            {
                *pc = 0;
            }
            else
            {
                int c;
     
                while ((c = fgetc(fp)) != '\n' && c != EOF)
                {
                }
            }
        }
    }
    Pour plus de précision sur le fonctionnement de fclean(), voir les archives du forum C. Cette fonction est à placer dans ta bibliothèque personnelle.

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 89
    Points : 108
    Points
    108
    Par défaut whaou.. Un grand merci!
    Bonjour thiery,

    Un grand merci pour toutes ces précicions!

    Je vais bien décortiquer tout ça!

    Un grand merci pour ton efficacité et ta précision

  4. #4
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Pour en apprendre plus sur les entrées-sortie utilisateur en C, je te recommande la lecture de cet article: http://emmanuel-delahaye.developpez.com/inputs.htm.

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

Discussions similaires

  1. Récupérer une saisie clavier de l'utilisateur
    Par le y@m's dans le forum Scripts/Batch
    Réponses: 5
    Dernier message: 23/09/2019, 19h25
  2. Richeditctrl - problème de saisie clavier
    Par KO-Tek dans le forum MFC
    Réponses: 5
    Dernier message: 20/12/2005, 11h15
  3. [PL/SQL] saisie clavier
    Par seal dans le forum Langage SQL
    Réponses: 3
    Dernier message: 16/08/2005, 11h54
  4. Simuler saisie clavier SendMessage et WM_KEYDOWN
    Par VoLc0m dans le forum Windows
    Réponses: 8
    Dernier message: 11/05/2005, 15h31
  5. Saisie clavier marche pas
    Par Dokho1000 dans le forum Entrée/Sortie
    Réponses: 8
    Dernier message: 11/03/2004, 12h16

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