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 :

probleme scanf


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur
    Avatar de Yoshio
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    1 732
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 732
    Par défaut probleme scanf
    Bonjour,

    Voici mon programme :
    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
     
    #include <stdio.h>
     
    int main() {
      float num1, num2;
      char op;
     
      printf("Entrer un nombre : ");
      scanf("%f", &num1);
      getchar();
     
      printf("Entrer un opérateur : ");
      if(scanf("%[+-*/=]", &op) != 1) {
        printf("Erreur - les opérateur valide sont + - * / =\n");
        printf("Veillez saisir un opérateur valide : ");
        scanf("%[+-*/=]", &op);
        getchar();
      }
     
      printf("Entre un nombre : ");
      scanf("%f", &num2);
      getchar();
     }

    Mon problème est que je n'arrive pas a corriger l'erreur suivante :
    - le premier scanf se fait bien
    - le 2eme aussi MAIS quand on entre autre chose que les op autorisé + - * / = le programme demande de réentrer un op valide. Et c'est ici que l'erreur survient. Voici ce que ca m'affiche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Entrer un nombre : 1
    Entrer un opérateur : 1
    Erreur - les opérateur valide sont + - * / =
    Veillez saisir un opérateur valide : Entre un nombre :
    Ca me met directement l'autre nombre alors que ca devrait me demander l'op.

    Quelqu'un sait d'ou provient l'erreur ?!

  2. #2
    Membre très actif Avatar de Goundy
    Profil pro
    Étudiant
    Inscrit en
    Avril 2005
    Messages
    605
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2005
    Messages : 605
    Par défaut
    tu ne peux pas, il faut que tu lis une saisie, ensuite tu fais des testes.
    Oublie scanf, et utilise fgets
    Compil your life guy!
    The Aures Project

  3. #3
    Rédacteur
    Avatar de Yoshio
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    1 732
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 732
    Par défaut
    oups Goundy lol merci de ta réponse

    j'ai éditer mon message pendant que tu écrivait le tient.

  4. #4
    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 Re: probleme scanf
    Citation Envoyé par omura
    Voici mon programme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      scanf("%f", &num1);
    2 conseils

  5. #5
    Membre émérite
    Avatar de Pouic
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    669
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 669
    Par défaut
    Si ton deuxieme scanf echoue, tu ne vides pas stdin : il y reste un '\n'.
    Ca arrive sur le troisieme scanf, qui echoue. Le getchar mange le '\n'.
    Et on arrive sur ton dernier scanf, qui lui attend ta saisie...

    Ton utilisation de scanf est assez hasardeuse : il manque des tests de verification de retour, et ce n'est pas un simple getchar qui videra stdin...
    Software becomes slower faster than hardware becomes faster
    [size=1]
    http://xrenault.developpez.com

  6. #6
    Rédacteur
    Avatar de Yoshio
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    1 732
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 732
    Par défaut
    est-on toujours obligé de faire comme dans le lien http://xrenault.developpez.com/tutoriels/c/scanf/ ou il parle des boucles avec scanf ?

    n'y a t-il pas un moyen plus concis ?!

  7. #7
    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 omura
    est-on toujours obligé de faire comme dans le lien http://xrenault.developpez.com/tutoriels/c/scanf/ ou il parle des boucles avec scanf ?
    Je suppose que oui. Je n'utilise pas scanf(), mais des solutions alternatives déjà exposées...

  8. #8
    Rédacteur
    Avatar de Yoshio
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    1 732
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 732
    Par défaut
    Je viens de regarder la fonction fgets et ca 'ma l'air un peu plus simple.

    Mais si l'utilisateur entre un chaine de caractère plus grande que la taille du tableau le programme foire. Il existe un moyen de contourner ceci ?!

  9. #9
    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 omura
    Je viens de regarder la fonction fgets et ca 'ma l'air un peu plus simple.

    Mais si l'utilisateur entre un chaine de caractère plus grande que la taille du tableau le programme foire. Il existe un moyen de contourner ceci ?!
    As-tu lu mon article en entier ?

  10. #10
    Rédacteur
    Avatar de Yoshio
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    1 732
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 732
    Par défaut
    bah j'ai lu la partie sur la saisie.

  11. #11
    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 omura
    bah j'ai lu la partie sur la saisie.
    Ok, j'ai oublié ce lien

    http://emmanuel-delahaye.developpez.com/inputs.htm

    Je le rajoute dans mon article.

  12. #12
    Rédacteur
    Avatar de Yoshio
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    1 732
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 732
    Par défaut
    Je suis en train de me perdre la

    J'ai utilisé vu le lien plus haut la fonction fgets() et maintenant c'est la fonction fgetc() lol

    Si on veux lire seulement le premier caractère saisi par l'utilisateur (je vais faire autrement vu le dernier lien passé) on doit mettre à la place de ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    sscanf (saisie, "%[0-9-]s", temp);
    ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    sscanf (saisie, "%1[0-9-]c", temp);

  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 omura
    Je suis en train de me perdre la
    Non, tu étends ton champ de connaissances, nuance !
    J'ai utilisé vu le lien plus haut la fonction fgets() et maintenant c'est la fonction fgetc() lol
    Ben oui, fgetc() est la brique de base...
    Si on veux lire seulement le premier caractère saisi par l'utilisateur (je vais faire autrement vu le dernier lien passé) on doit mettre à la place de ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    sscanf (saisie, "%[0-9-]s", temp);
    ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    sscanf (saisie, "%1[0-9-]c", temp);
    Non. La première solution est la bonne pour tester le domaine. Ensuite, tu utiliseras temp[0] si c'est le seul caractère qui t'intéresse...

    Si tu veux maitriser le sujet, il faut passer un peu de temps sur les exemples, le code fourni, expérimenter etc. ça ne se fait pas en 5 minutes. Il faut plusieurs jours et surtout plusieurs nuits (la nuit, le cerveau organise les acquisitions du jour).

  14. #14
    Rédacteur
    Avatar de Yoshio
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    1 732
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 732
    Par défaut
    oki !! merci de toutes ces réponses , je vais essayer de faire quelque chsoe avec ca lol

  15. #15
    Rédacteur
    Avatar de Yoshio
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    1 732
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 732
    Par défaut
    Excusez pour le double post mais j'ai encore un petit souci (je vais continuer ce post à la place d'en créer un autre ca me semble plus logique)

    Quand j'utilise plusieurs scanf l'un à la suite de l'autre il y en a toujours un qui ne marche pas.
    Après avoir bien lu tout les tuto proposé plus haut et essayé plein de choses je n'arrive pas à trouver le bon codes pour éviter ce bug.

    Que je mette 3 scanf différents ou alors 3 boucles de scanf différentes avec gestion d'erreur, j'ai toujours le dernier scanf ou je ne peux pas entrer de valeur.
    J'ai essayer de placer getchar() un peu partout (lol) et rien à faire. (fflush ne marche pas sous linux donc ne sert à rien dans mon cas)

    Quelqu'un pourrait-il me donner le code pour cela (svp pas de fgets)

  16. #16
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Que je mette 3 scanf différents ou alors 3 boucles de scanf différentes avec gestion d'erreur, j'ai toujours le dernier scanf ou je ne peux pas entrer de valeur.
    J'ai essayer de placer getchar() un peu partout (lol) et rien à faire. (fflush ne marche pas sous linux donc ne sert à rien dans mon cas)

    Quelqu'un pourrait-il me donner le code pour cela (svp pas de fgets)
    Donne l'exemple réduit au minimum et compilable qui montre le problème ou arrête d'utiliser scanf (ce qui ne serait pas une mauvaise idée...)

    Jc

  17. #17
    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 omura
    Quand j'utilise plusieurs scanf l'un à la suite de l'autre il y en a toujours un qui ne marche pas.
    Comme on le dit souvent, si on est pas expert, scanf() est à éviter... Mais bon si tu te crois meilleur que les autres...
    Après avoir bien lu tout les tuto proposé plus haut et essayé plein de choses je n'arrive pas à trouver le bon codes pour éviter ce bug.
    • As-tu compris que dans certains cas (que je ne connais pas par coeur, tu connais mes préférences...), il restait un '\n' dans stdin après un appel à scanf(), ce qui perturbe les saisies suivantes.
    • Testes tu bien tous les codes retour de scanf() ?
    • Que fais-tu en cas d'erreur ?

    Sans voir le code qui ne fonctionne pas, et les conditions dans lesquelles il est invoqué, difficile d'en dire plus.
    <...>Quelqu'un pourrait-il me donner le code pour cela (svp pas de fgets)
    Pourquoi "pas de fgets()" ? C'est pourtant la solution habituellement adoptée par l'industrie qui recherche simplicité et fiabilité.

    Voici néanmoins un exemple de code qui regle définitivement tes probèmes de saisie (basé sur fgetc(), garanti sans fgets() et sans scanf() ! ) :

    http://emmanuel-delahaye.developpez.com/clib.htm
    Module IO

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

Discussions similaires

  1. Calculatrice, probleme scanf()
    Par toopa dans le forum Débuter
    Réponses: 5
    Dernier message: 09/01/2009, 16h26
  2. scanf gros probleme
    Par widguet dans le forum C
    Réponses: 9
    Dernier message: 28/12/2006, 19h00
  3. [debutant] Probleme avec le scanf()
    Par mc_fly dans le forum C
    Réponses: 21
    Dernier message: 07/09/2006, 12h22
  4. Aide SVP probleme scanf
    Par ceagle75 dans le forum C
    Réponses: 10
    Dernier message: 17/06/2006, 18h04
  5. gets() a la suite de scanf() -> probleme
    Par ickis dans le forum C
    Réponses: 12
    Dernier message: 14/12/2003, 20h24

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