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 :

Bug que je ne comprend pas . . . [Débutant(e)]


Sujet :

C

  1. #1
    Membre Expert
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Par défaut Bug que je ne comprend pas . . .
    Bonjour.

    j'ai essayé un petit script en console pour apprendre, mais il me fait une erreur que je ne comprend pas: le scripte est:
    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>//librairie fonctions math
    int main(int argc, char *argv[])
    {
      long nombreDeVies = 50; // Au départ, le joueur a 5 vies
      int moinsvie=0;
      printf("Vous avez %ld vies\n", nombreDeVies);
      printf("**** B A M ****\n"); // Là il se prend un grand coup sur la tête
      nombreDeVies--; // Il vient de perdre une vie !
      printf("Ah desole, il ne vous reste plus que %ld vies maintenant !\n\n", nombreDeVies);
      while (nombreDeVies!=0)
      {
    	printf("combien voulez vous perdre de vies ?\n");
    	scanf("%ld",&moinsvie);// integrer des données
    	nombreDeVies-=moinsvie;
    	for (int i=0;i<moinsvie;i++)//affiche moinsvie blam
    		  printf("---BLAM ! ----\n");
    	printf("\n");
    	nombreDeVies=(nombreDeVies<0)? 0:nombreDeVies;//toujours mettre positif (au fait, ça aurais marché si j'avais juste déclaré nombreDeVies en unsigned ?
    	if (nombreDeVies==0) 
               printf("il ne vous reste plus de vies :D  (quel sadique celui-la)\n\n");
            else 
                printf("il ne vous reste plus que %ld vies maintenant !\n\n", nombreDeVies);
      }
      system("PAUSE"); 
      return 0;
    }
    certains reconaitrons peu-être l'origine

    le problèm est que quand je fait fonctionner le script normalement, tout va bien: il me retire le nombre de vie que je demande en faisant les nombres de "blam" corespondant.
    mais quand je lui entre une valeur non entière ou non numérique, le script part en boucle sans executer le scanf en retirant la dernière valeur entrée (soit l'ancienne valeur de moinsvie.) (je vous laisse imaginer si j'ai entré 0).

    j'aimerais bien savoir pourquoi il fait ça: je me serais attendu à ce qu'il plante, qu'il m'affiche une erreur, qu'il mette une valeur nulle ou autre à moinsvie, mais là, je ne comprend pas...

    si vous pouviez m'éclairer là dessus ...

    merci

  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 : 48
    Localisation : Suisse

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Au passage:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    scanf("%ld",&moinsvie);
    Tu dois utiliser le spécificateur de format %d, car moinsvie est un entier de type int.

    Quant à ta boucle infine, bienvenue dans les joies de la fonction scanf(). Ici, si tu entres quelque chose d'autre qu'un entier comme par exemple un caractère, scanf échoue et ne place aucune valeur dans moinsvie (moinsvie gard e sa valeur précédente. Comme scanf() et une fonction d'entrée bufferisée, le caractère invalide n'est pas consommé et reste disponible pour le prochain appel à scanf() lors de l'itération suivante. Evidemment, à l'itération suivante, scanf() échouera de nouveau.

    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 Expert
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Par défaut
    merci, je pensait qu'en cas d'erreur, il arretait le programme.
    bon, j'allait te demander comment vider le buffer, mais il serait plus sage de lire le chapitre sur la gestion d'erreur avant, au lieu de poser des questions inutiles.

    merci encore

  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 : 48
    Localisation : Suisse

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Tu trouveras des réponses à la question: pourquoi est-il déconseillé d'utiliser scanf dans la FAQ:

    http://c.developpez.com/faq/c

    Cette fonction est délicate à utiliser proprement, mais un excellent tutoriel est disponible sur developpez:

    http://xrenault.developpez.com/tutoriels/c/scanf/

    Toutefois, vu la complexité de l'animal, beaucoup de programmeurs même expérimentés préfère utiliser fgets couplé à une analyse à la main ou à sscanf.

    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++

    +

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

Discussions similaires

  1. Boites de messages perso, Bug que je ne comprends pas
    Par ToTo13 dans le forum AWT/Swing
    Réponses: 1
    Dernier message: 13/03/2008, 15h53
  2. [Débutant] Message d'erreur que je ne comprends pas
    Par Le Furet dans le forum Langage
    Réponses: 2
    Dernier message: 25/02/2006, 17h37
  3. [PostGreSQL] une erreur que je ne comprends pas
    Par flo78 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 02/02/2006, 10h18
  4. [thread][methodologie]Quelque chose que je ne comprends pas!
    Par norkius dans le forum Général Java
    Réponses: 5
    Dernier message: 16/03/2005, 14h01
  5. [Rave] un message que je ne comprends pas
    Par Clotilde dans le forum Rave
    Réponses: 2
    Dernier message: 30/09/2003, 21h46

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