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 :

Erreur boucle et scanf


Sujet :

C

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2011
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2011
    Messages : 3
    Par défaut Erreur boucle et scanf
    Bonjour,
    Je viens à vous pour comprendre se qu'il se passe réellement lors de l'exécution de mon code.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int prompt;
    printf("Entrez le nombre 1 : ");
    scanf("%d", &prompt);
    while (prompt != 1){
        printf("Bug!");
        scanf("%d", &prompt);
    }
    printf("Vous avez entré le nombre : %d\n", prompt);
    Savez vous pourquoi, lors de l'exécution du code, si l'on rentre autre chose que '1', j'ai "Bug!" qui s'affiche en boucle jusqu'à ce que je kill le truc?
    Pourquoi ne prend-il pas en compte l'autre scanf (même avec un fflush)?
    J'ai déjà corrigé ce bug, mais je cherche vraiment à comprendre ce qu'il se passe!

    Merci d'avance!
    Jérôme.

  2. #2
    Membre Expert
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

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

    Informations forums :
    Inscription : Mai 2010
    Messages : 871
    Par défaut
    Tu confonds 1 et '1'. Quand tu rentres le chiffre 1 au clavier tu récupères en fait la valeur 49. Donc la il faudrait écrire ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    int prompt;
    printf("Entrez le nombre 1 : ");
    scanf("%d", &prompt);
    while (prompt != '1'){
        printf("Bug!");
        scanf("%d", &prompt);
    }
    printf("Vous avez entré le nombre : %d\n", prompt);

  3. #3
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Par défaut
    Bonjour,

    Il ne faut pas lire les entrees clavier avec scanf.

    Tuto : http://emmanuel-delahaye.developpez....ees-solides-c/

    http://c.developpez.com/cours
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    Savez vous pourquoi, lors de l'exécution du code, si l'on rentre autre chose que '1', j'ai "Bug!" qui s'affiche en boucle jusqu'à ce que je kill le truc?
    Je suppose que par "autre chose que '1'", tu veux dire caractères alphabétiques ?
    C'est normal. La fonction s'attend à ce que tu saisisses un nombre. Or, si tu saisis un caractère autre qu'un chiffre, la conversion échoue, et le caractère reste dans le buffer. Du coup, à chaque tour de boucle, la fonction se retrouve avec ce même caractère...

    Pourquoi ne prend-il pas en compte l'autre scanf (même avec un fflush)?
    Il ne faut jamais fflusher stdin !

    Le mieux, c'est de ne pas utiliser scanf. Tu peux par exemple utiliser la méthode fgets et sscanf.

    Tu confonds 1 et '1'. Quand tu rentres le chiffre 1 au clavier tu récupères en fait la valeur 49. Donc la il faudrait écrire ça :
    Non, il s'agit bien de la saisie d'un nombre et non d'un caractère.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2011
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2011
    Messages : 3
    Par défaut
    C'est normal. La fonction s'attend à ce que tu saisisses un nombre. Or, si tu saisis un caractère autre qu'un chiffre, la conversion échoue, et le caractère reste dans le buffer. Du coup, à chaque tour de boucle, la fonction se retrouve avec ce même caractère...
    Merci de ta réponse!
    Mais pourquoi le caractère reste-t-il dans le buffer?

    Tu confonds 1 et '1'.
    Par '1', j'entendais 1 "tout seul".

    Merci en tout cas!!

  6. #6
    Membre émérite Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Par défaut
    Bonjour,

    Citation Envoyé par SexyBourbour Voir le message
    Mais pourquoi le caractère reste-t-il dans le buffer?
    jeroman vient de répondre : « la conversion échoue ».

    Lors d'une conversion d'une chaîne de caractères en nombre, la fonction lit autant de caractères numériques que possible (éventuellement avec des signes de ponctuation et des caractères blancs au début), et s'arrête au premier caractère ne pouvant satisfaire la conversion.
    En prévision des lectures futures, le « curseur » reste juste avant ledit caractère.

    C'est un peu comme si tu disais à quelqu'un : « Cours jusqu'au prochain mur, et donne-moi la distance parcoure. Recommence tant que tu n'as pas franchi la ligne d'arrivée. » alors qu'il y a un mur juste devant lui.
    Tu peux être sûr qu'il n'atteindra jamais la ligne d'arrivée, le pauvre...

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2011
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2011
    Messages : 3
    Par défaut
    Merci à vous!
    Ce que vous m'avez dit m'a clairement aidé

    Je marque cette question comme résolue!

    Merci!
    À bientôt!

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

Discussions similaires

  1. erreur boucle algébrique
    Par apuytison dans le forum Simulink
    Réponses: 0
    Dernier message: 02/02/2009, 15h01
  2. [MySQL] Erreur boucle while et foreach
    Par tiesto95 dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 13/01/2009, 12h01
  3. erreur boucle de redirection firefox
    Par calitom dans le forum Débuter
    Réponses: 3
    Dernier message: 10/12/2008, 11h02
  4. [VBA-E] erreur boucle for each
    Par Mut dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 15/02/2006, 16h38
  5. Erreur: "Boucle et TStringList"
    Par Romain² dans le forum Langage
    Réponses: 25
    Dernier message: 22/12/2005, 22h26

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