problème en C

problème en C - C - Programmation

Marsh Posté le 18-06-2006 à 12:31:04    

slt,  
j' essay de programmer une sorte de jeu, le pc génère un nombre entre 1 et 100, l' utilisateurs doit donner le bon nombre au pc, si ce n'est pa le bon nombre, le pc "aide" l' utilisateur.
mon problème, c'est que dès que je compile et que je lance mon programme, il me demande le nombre je rentre un nombre entre 1 et 100, j'appuie sur entrée et sa bug, il veut envoyer un rapport d'erreurs a microsoft.
 
voici mon code:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
 
int main(int argc, char *argv[])
{
    //on definie les variables
const long MAX = 100, MIN = 1;
long nombreMystere = 0;
long nombreEntree = 0;
 
//generation du nombre
srand(time(NULL));
nombreMystere = (rand() % (MAX - MIN + 1)) + MIN;
do
{
              //on demande le nombre
     printf ("quel est le nombre?\n" );
 scanf ("%ld", nombreEntree);
              //on compare le nombre entrée avec le nombre mystere
if (nombreMystere > nombreEntree)
printf ("c'est plus!\n" );
else if (nombreMystere < nombreEntree)
printf ("c'est plus!\n" );
else
printf ("bravo! vous avez trouvez le nombre mystère!!!\n\n" );
 } while (nombreEntree = nombreMystere);
 
  system("PAUSE" );  
  return 0;
}

Reply

Marsh Posté le 18-06-2006 à 12:31:04   

Reply

Marsh Posté le 18-06-2006 à 12:43:46    

essai d'enlever l'attribut const à  MAX et MIN
 
Autre chose :  
 

Code :
  1. scanf ("%ld", nombreEntree);


 
il faut lire :
 

Code :
  1. scanf ("%ld", &nombreEntree);


 
C'est quoi ce while :

Code :
  1. while (nombreEntree = nombreMystere);


 
Ici tu ne teste pas l'égalité, mais tu réalise une affectation.
 
Je pense que tu voulais :  
 

Code :
  1. while (nombreEntree != nombreMystere);


Message édité par _kal_ le 18-06-2006 à 12:50:17
Reply

Marsh Posté le 18-06-2006 à 14:07:43    

ok merci kal, sa marche ;-)

Reply

Marsh Posté le 18-06-2006 à 19:28:19    

Un compilo bien réglé signale ce genre d'erreurs :
     while (nombreEntree = nombreMystere);

Reply

Marsh Posté le 19-06-2006 à 11:43:13    

Yep.
 
Evite aussi scanf, utilise plutot fgets et sscanf :jap:

Reply

Marsh Posté le 21-06-2006 à 14:21:41    

_kal_ a écrit :

Yep.
 
Evite aussi scanf, utilise plutot fgets et sscanf :jap:


 
pourquoi ?

Reply

Marsh Posté le 21-06-2006 à 14:23:40    

Parce qu'entre les mains d'un débutant, scanf() est une fonction quiosdfskldjkpquaééà089 ?RPZ?
 
Segmentation fault (core dumped)

Reply

Marsh Posté le 21-06-2006 à 14:37:19    

Elmoricq a écrit :

Parce qu'entre les mains d'un débutant, scanf() est une fonction quiosdfskldjkpquaééà089 ?RPZ?
 
Segmentation fault (core dumped)


 
 :??:  :sleep:  :sleep:  :sleep:

Reply

Marsh Posté le 21-06-2006 à 15:20:14    


Parce que "scanf" attend une entrée "formattée" et qu'il s'arrête à tout ce qui ne correspond pas au format, ce qui peut poser des pb
 
Exemple: tu veux faire saisir un nombre puis un texte


int i;
char txt[11];
printf("Entrez un nombre :" );
scanf("%d", &i);
printf("Entrez un texte (10 car max):" );
scanf("%s", txt);


Il y a de grandes chances que tu n'arrives jamais à saisir ton texte. Pourquoi ? Parce que, quand tu tapes ton nombre, tu finis ta saisie par "return" (normal). Mais "scanf" extrait les chiffres du clavier et laisse le "return" qui n'est pas un chiffre. Et lors du "scanf" suivant, ben il lit le "return" qui est resté dans le clavier comme un gland. Tu peux évidemment mettre un "getchar()" juste après la saisie du nombre pour purger ce "return" mais si tu fais un programme pour d'autres personnes, avec "scanf" tu ne peux pas contrôler ce que les autres vont taper. Si l'utilisateur est neuneu, il peut taper "12xqsd" pour le nombre et là, t'es bien avancé.
Et il peut aussi entrer plus de 10 caractères dans la saisie du texte ce qui risque de te provoquer beaucoup de pb.
 
Avec "fgets" 1) tout ce qui entre est du texte que tu peux ensuite controler à ta façon et 2) il limite la saisie selon tes choix ce qui t'évite beaucoup de soucis


int i;
char txt[11];
char buf[1024];
printf("Entrez un nombre :" );
fgets(buf, 1024, stdin);
sscanf(buf, "%d", &i);
printf("Entrez un texte (10 car max):" );
fgets(txt, 11, stdin);


C'est pas beaucoup de travail en plus...


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 21-06-2006 à 15:21:53    

en fait Elmoricq est un bot codé avec des scanf().

Reply

Marsh Posté le 21-06-2006 à 15:21:53   

Reply

Marsh Posté le 21-06-2006 à 15:23:13    

même
 
do {
printf("Entrez un nombre :" );
fgets(buf, 1024, stdin);
} while( sscanf(buf, "%d", &i) != 1 );
 
c'est pas mal non plus.


Message édité par bjone le 21-06-2006 à 15:23:22
Reply

Marsh Posté le 21-06-2006 à 15:40:37    

merci s@ver  :)  , je comprend mieu mnt
 
 

Reply

Marsh Posté le 30-06-2006 à 10:19:24    

yobo1 a écrit :

 
[...]
              //on compare le nombre entrée avec le nombre mystere
if (nombreMystere > nombreEntree)
printf ("c'est plus!\n" );  :pt1cable:  
else if (nombreMystere < nombreEntree)
printf ("c'est plus!\n" ); :pt1cable:  
else
[...]
}


 
juste au passage, tu l'as testé ton prog? tu parviens à trouver la solution?  ;)


---------------
celui qui pose une question est idiot 5 minutes, celui qui n'en pose pas le reste toute sa vie.
Reply

Marsh Posté le 30-06-2006 à 10:52:29    

bipeuh a écrit :

juste au passage, tu l'as testé ton prog? tu parviens à trouver la solution?  ;)


[:ddr555] :lol:  


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 30-06-2006 à 12:16:12    

Reply

Marsh Posté le 30-06-2006 à 12:53:00    


 
waw c'est trés bien expliqué aussi sur le site d'Emmanuel Delahaye;
merci
 
 
 

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed