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 :

test de la validité d'un caractere


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Par défaut
    Ben il fonctionne sous DevCpp car DevCpp c'est sous Windows et fflush(stdin) fonctionne sous Windows ???!!!

    Le man est pourtant bien explicite (voir les phrases mises en gras par David Schris)

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Août 2003
    Messages
    878
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 878
    Par défaut
    Citation Envoyé par pimousse92
    doucement, je débute.
    Rien de méchant dans mon commentaire, juste un rappel.
    Moi non plus je ne lisais pas (assez) la doc. à mes débuts...et puis j'en ai eu marre de ne pas comprendre pourqoi ceci ou pourquoi cela...
    Citation Envoyé par pimousse92
    j'admet mon erreur néanmoins j'ai toujours du mal à comprendre car j'ai bien vu que fflush pouvait fonctionner d'après la faq dans certaines conditions
    Pour ce qui est de la FAQ, je ne sais pas.
    Citation Envoyé par pimousse92
    et je me rapelle bien l'avoir utiliser sous devcpp avant la saisie d'un caractere avec un stdin.
    Sauf que Dev-C++ c'est sous Windows et qu'un terminal sous Linux n'est peut-être (<-et c'est peu dire) pas géré de la même façon que sous Windows.
    Donc, une fonction de plus haut niveau comme fflush() n'est probablement pas implémentée de la même manière.
    Citation Envoyé par pimousse92
    je ne comprend pa bien man.
    comment d'après man utiliser fflush dans mon algo ?
    D'après le man tu ne peux pas puisqu'il dit que c'est pour les flux ouverts en écriture.

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 14
    Par défaut
    aprés ces précisions, est-ce que je peux "accuser" mon utilisation de fflush sous linux ?

  4. #4
    Membre émérite

    Profil pro
    Inscrit en
    Août 2003
    Messages
    878
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 878
    Par défaut
    De toutes façons, tu peux accuser qui tu veux : ça n'a jamais fait mieux fonctionner un programme

  5. #5
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Par défaut
    Citation Envoyé par pimousse92
    aprés ces précisions, est-ce que je peux "accuser" mon utilisation de fflush sous linux ?
    Oui en effet c'est a cause de ca que ca ne fonctionnais pas.
    Je reprends ton post initial.
    Ton message ete affiché 2 fois car pour le scanf(%c", &rep); lorsque tu appui sur entrée pour confirmer la saisie le \n et mis dans le tampon et comme ton fflush ne fonctionnait pas lors du 2eme scanf rep prenait la valeur dans le tampon (\n).
    En gros tu avais un scanf sur 2

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    fflush(stdin) est garanti marcher sous Windows, mais ce n'est pas défini par le standard et par conséquent, il y a des OS où ce n'est pas implémenté (par exemple, pratiquement (ou absolument) tous les unixoïdes...)
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Membre chevronné Avatar de Jack_serious
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    350
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 350
    Par défaut Oui mais non
    Vu qu on peut vider le buffer d'entree avec une simple boucle, il est plus propre de na pas utiliser fflush(stdin) du tout. Meme si ca marche.
    (En plus comme ca c est portable )

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par pimousse92
    comment expliques tu que fflush(stdin) fonctionne sous devcpp ? ce n'est pas si evident quand on a pas l'info, la preuve cela n'a sauté aux yeux de personne...
    C'est une extension MS-DOS Windows. Comme c'est pas portable, vu du C, ça n'existe pas, et il donc recommandé de ne pas pas l'utiliser, surtout que des solutions alternatives existent, à commencer par fgets() qui résout définitivement les problèmes de caractères non lus.

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

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 14
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Citation Envoyé par pimousse92
    comment expliques tu que fflush(stdin) fonctionne sous devcpp ? ce n'est pas si evident quand on a pas l'info, la preuve cela n'a sauté aux yeux de personne...
    C'est une extension MS-DOS Windows. Comme c'est pas portable, vu du C, ça n'existe pas, et il donc recommandé de ne pas pas l'utiliser, surtout que des solutions alternatives existent, à commencer par fgets() qui résout définitivement les problèmes de caractères non lus.

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


    et pour filtrer des lettres est-ce qu'il suffit de remplacer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ret = sscanf (saisie, "%[0-9-]s", temp);
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ret = sscanf (saisie, "%[a-z-]s", temp);

  10. #10
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 14
    Par défaut
    question préliminaire : j'utilises getchar pour faire une pause, est-ce correct ?
    la question sur les flux :
    j'utilises

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while ((x = getchar()) != '\n' && x != EOF);
    plutot que pour vider le flux avant un getchar.
    (sans ça le prog ne fais pas de pause lorsque l'on utise getchar pour une deuxieme fois)
    jusque là tout va bien sauf pour le premier getchar où je dois taper 2 fois sur entrée plutot qu'une... comment se fait-il ?

    lien vers mon prog (voir le sous programme une_pause();
    http://pastebin.com/429647

  11. #11
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    oui, c'est correct d'utiliser getchar()

    fflush(stdin) n'est pas standard, ça ne marche pratiquement que sous windows
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  12. #12
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 14
    Par défaut
    Citation Envoyé par pimousse92
    (...)
    j'utilises

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while ((x = getchar()) != '\n' && x != EOF);
    plutot que pour vider le flux avant un getchar.
    (sans ça le prog ne fais pas de pause lorsque l'on utise getchar pour une deuxieme fois)
    jusque là tout va bien sauf pour le premier getchar où je dois taper 2 fois sur entrée plutot qu'une... comment se fait-il ?

    lien vers mon prog (voir le sous programme une_pause();
    http://pastebin.com/429647
    pour ne pas perdre le fil...

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par pimousse92
    et pour filtrer des lettres est-ce qu'il suffit de remplacer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ret = sscanf (saisie, "%[0-9-]s", temp);
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ret = sscanf (saisie, "%[a-z-]s", temp);
    C'est possible, mais je ne connais pas assez bien scanf() pour répondre avec certitude.

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par pimousse92
    question préliminaire : j'utilises getchar pour faire une pause, est-ce correct ?
    Ca dépend de ce qu'il y a eu avant. Avec fgets(), c'est facilement prévisible et mesurable, avec scanf(), je ne sais pas faire. Je préconise d'utiliser exclusivement fgets() pour les saisies et donc d'avoir un conportement parfaitement et simplement prévisible.
    la question sur les flux :
    j'utilises
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while ((x = getchar()) != '\n' && x != EOF);
    Ca, ça sert à nettoyer le buffer stdin si on est sûr qu'il y a encore des restes... On s'en sert par exemple après un fgets() si on a pas trouvé le '\n'.
    plutot que
    Comme on se tue à te l'expliquer, ceci n'est pas défini par le langage C. Qu'il existe une extension non portable n'en fait évidemment pas une solution universelle. Formellement déconseillé.
    pour vider le flux avant un getchar.
    (sans ça le prog ne fais pas de pause lorsque l'on utise getchar pour une deuxieme fois)
    jusque là tout va bien sauf pour le premier getchar où je dois taper 2 fois sur entrée plutot qu'une... comment se fait-il ?

    lien vers mon prog (voir le sous programme une_pause();
    http://pastebin.com/429647
    Je préconise un usage maitrisé et exclusif de fgets(). Le reste, c'est trop fort pour moi et ça me prend la tête. Pas le temps pour ces c*nneries...

  15. #15
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 14
    Par défaut
    Dans mon interet, je vais revenir à des choses plus simples (je penses aux saisies) afin de mieux comprendre le C... J'ai bien compris mes maladresses même si je les ai remis sur le tapis, c'était en fait pour mieux exposer ma démarche initiale...

    Est-ce que vous avez un lien qui m'explique comment faire une pause jusqu'à l'appui d'une touche du clavier ?

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par pimousse92
    Est-ce que vous avez un lien qui m'explique comment faire une pause jusqu'à l'appui d'une touche du clavier ?
    fgets(). On en sort par <enter>.

Discussions similaires

  1. Test de la validité d'un EMAIL en VB
    Par rpedro0921 dans le forum VB.NET
    Réponses: 6
    Dernier message: 24/03/2014, 10h14
  2. [Débutant] test d'une chaine a 8 caracteres en VB.net
    Par asssmaa dans le forum VB.NET
    Réponses: 1
    Dernier message: 08/05/2012, 10h14
  3. Réponses: 5
    Dernier message: 05/07/2006, 18h54
  4. Test PostgreSQL v8 avec NAMEDATALEN = 128 caracteres
    Par hondjack dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 13/10/2004, 00h32
  5. [debutant][bean] test de validité d'un champs
    Par LoLoSS dans le forum Servlets/JSP
    Réponses: 5
    Dernier message: 20/05/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