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 :

controle de saisie avec scanf


Sujet :

C

  1. #1
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Avril 2010
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2010
    Messages : 115
    Points : 70
    Points
    70
    Par défaut controle de saisie avec scanf
    Bonjour

    J'aimerais lire la valeur entrée par l'utilisateur et en faire un contrôle de saisie
    voila le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    printf("entrer la valeur de l'entrier a");
     
    while (scanf( "%d",&a) !=1) {
               fprintf(stderr,"s",erreur! veuillez saisir un entier
    }
    fflush(stdin);
    Merci par avance

  2. #2
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Avril 2010
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2010
    Messages : 115
    Points : 70
    Points
    70
    Par défaut
    bonjour

    J'ai oublie de poser la question, dans le code ce-dessus, le bleme c'est que j'obtiens un boucle infinie!!
    j'ai pas le droit de lire un nouvel caractère lors de l'échec de la première lecture.

    Merci d'avance pour toute reponse

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 27
    Points : 25
    Points
    25
    Par défaut
    Hello,

    Il me semble qu'avec scanf, on ne peut rien faire de "bien"

    Solution moche qui doit marchouiller :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    while (scanf( "%d",&a) !=1) {
        getchar(); // pour vider l'entrée
    }
    Cependant, ce n'est pas très convenable, car cela dépend complètement de l'entrée standard. (d'ailleurs, il vaut mieux éviter fflush(stdin) aussi)

    Il vaudrait mieux stocker toute l'entrée standard dans un buffer, et traiter le buffer directement !

  4. #4
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Avril 2010
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2010
    Messages : 115
    Points : 70
    Points
    70
    Par défaut
    MERCI bloomenthal , j'ai essayé le getchar et c'est résolu !!

  5. #5
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 896
    Points : 219 548
    Points
    219 548
    Billets dans le blog
    125
    Par défaut
    Bonjour,

    Je dis STOP! Avec scanf on peut faire quelque chose de bien ( en lisant la doc ). D'ailleurs, je suis presque sur que dans la FAQ de ce site, tout est expliqué. (Sinon, je le ferai sur demande)

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 27
    Points : 25
    Points
    25
    Par défaut
    Citation Envoyé par LittleWhite Voir le message
    Bonjour,

    Je dis STOP! Avec scanf on peut faire quelque chose de bien ( en lisant la doc ). D'ailleurs, je suis presque sur que dans la FAQ de ce site, tout est expliqué. (Sinon, je le ferai sur demande)
    Facile à dire :p mais très bien, je serai curieux de voir ça ! Sur tes conseils et par acquis de conscience, j'ai regardé l'article "Scanf démythifiée" de Developpez.com, la seule solution proposée pour virer le '\n' (ce qui causait le "bug" ici) est justement de faire un getchar().

    Or, cette solution dépendante de l'entrée, dans le sens ou ce n'est pas complètement "atomique" (on risque de demander deux accès à l'entrée pour comprendre qu'il faut s'arrêter là ou un seul aurait suffit), ce qui pourrait causer des soucis dans certains environnements, complexes certes, en programmation système. Bien sur, c'est un cas (très) extrême, mais ça existe. Bien entendu, j'ai peut-être été un peu intégriste en disant que c'était "moche", puisque dans ce contexte de programmation, ça ne pose aucun problème.

  7. #7
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 896
    Points : 219 548
    Points
    219 548
    Billets dans le blog
    125
    Par défaut
    Moi aussi j'avais vu la FAQ. Pourtant je pensais qu'il y avait une autre entrée.
    Je pense que l'on pouvait vidé le buffer avec un flush() ou alors une autre commande.
    Bref, je suis toujours très d'accord que le scanf est assez pénible à utilisé ( pour eviter les erreurs ) mais il est aussi très puissant

  8. #8
    Futur Membre du Club
    Inscrit en
    Avril 2008
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    il suffisait de mettre ton "fflush(stdin);" dans ta boucle while...

  9. #9
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 397
    Points : 23 761
    Points
    23 761
    Par défaut
    Bonjour,

    Citation Envoyé par router_ Voir le message
    J'aimerais lire la valeur entrée par l'utilisateur et en faire un contrôle de saisie. voila le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    …
     
    fflush(stdin);
    Citation Envoyé par Tifou92 Voir le message
    il suffisait de mettre ton "fflush(stdin);" dans ta boucle while...
    Non ! On ne peut pas vider le tampon du clavier avec fflush(stdin). Les plateformes sur lesquelles cela fonctionne quand même sont dans l'erreur. Voir la F.A.Q..

    C'est une mauvaise interprétation du sens de cette fonction. « flush » (dans le sens de « tirer la chasse ») n'efface pas un tampon mais le vide, dans le sens où elle provoque l'envoi immédiat de données en attente vers leur destinataire. Donc, à aucun moment il n'y a destruction de données.

    Il se trouve que dans le cas de stdin, le destinataire en question, c'est justement le processus qui fait appel à fflush. S'il ne lit pas les données, il n'y a aucune raison pour qu'elles bougent. En tout état de cause, interprété correctement, un fflush sur stdin ne pourrait que provoquer l'afflux de données supplémentaires et surtout pas leur disparition.

  10. #10
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    Non ! On ne peut pas vider le tampon du clavier avec fflush(stdin). Les plateformes sur lesquelles cela fonctionne quand même sont dans l'erreur.
    Pour être précis, c'est un comportement indéfini. Une implémentation conforme peut faire ce qu'elle souhaite dans ce cas là, y compris vider le buffer. Au sens strict, elles ne sont donc pas dans l'erreur mais le code ne sera pas portable.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Controler une saisie avec un masque
    Par minooo dans le forum JSF
    Réponses: 2
    Dernier message: 07/06/2011, 13h04
  2. comment sécuriser la saisie en C avec scanf?
    Par bouraouimed dans le forum Linux
    Réponses: 4
    Dernier message: 08/09/2010, 08h51
  3. Controle de saisie avec shell
    Par direct dans le forum Linux
    Réponses: 3
    Dernier message: 19/04/2009, 23h56
  4. Controler une saisie avec un masque
    Par marinew dans le forum JSF
    Réponses: 3
    Dernier message: 24/10/2007, 15h39
  5. PB avec scanf
    Par ché dans le forum C
    Réponses: 6
    Dernier message: 13/08/2003, 07h25

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