impossible de rejouer....probleme de scanf :(

impossible de rejouer....probleme de scanf :( - C - Programmation

Marsh Posté le 31-12-2008 à 00:19:59    

Bonjour,
j'ai fait un petit jeu en C et je suis face a un probleme que je n'arrive pas a résoudre!!!
Voila lorsque la partie se termine je propose de rejouer mais le scanf correspondant à la saisie de la réponse ne fonctionne pas.
 
voici une partie du code:

Citation :


main()
{
  char plateau[10][10];
  char joueur1[15];
  char joueur2[15];
  int joueur;
  int p;
  int i;
  int numcolonne;
  int numligne;
  int victoire;
  int nbjeu;
  char rejoue;
  joueur=1;
  printf("\nBienvenue dans Neomix!!!\n" );
  rejoue='o';
  while(rejoue=='o')
    {
      printf("\nentrez le nom du joueur 1:" );
      scanf("%s",joueur1);
      printf("entrez le nom du joueur 2:" );
      scanf("%s",joueur2);
      printf("%s joue avec les O et %s joue avec les X\n",joueur1, joueur2);
      initialisation(plateau);
      affichage(plateau);
      victoire=0;
      nbjeu=0;
      while(victoire!=1 && nbjeu<60)
 {
   oujouer(&numligne,&numcolonne, joueur, joueur1, joueur2);
   jouer(plateau,&p,numligne,numcolonne,&joueur);
   resultatjouer(&p, &numligne, &numcolonne, plateau, &joueur, joueur1,joueur2);
   affichage(plateau);
   victoire=gagner(numligne,numcolonne, plateau);
   nbjeu=nbjeu+1;
 }
      if(victoire==1)
 {
   if(joueur==2)
     printf("%s est vainqueur\n",joueur1);
   else
     printf("%s est vainqueur\n",joueur2);
 }
      if(nbjeu==60)
 printf("match nul\n" );
      printf("Voulez vous une nouvelle partie?(o/n)\n" );
      scanf("%c",&rejoue);
 
    }
}
 


 
Merci d'avance de votre aide ;)

Reply

Marsh Posté le 31-12-2008 à 00:19:59   

Reply

Marsh Posté le 31-12-2008 à 09:47:19    

scanf est bancal. Utilisez fgets sur stdin.

Reply

Marsh Posté le 31-12-2008 à 11:17:45    

Problème bien connu me semble-t-il en C.
Une recherche aurait donné de bonnes réponses...
M'enfin, puisque je suis en plein dans le C, je me lance sur quelques explications.
 
Ton problème vient du fait que l'entrée standard n'est pas purgée aprés un premier appel à scanf().
Classiquement on utilise ce genre de fonction pour purger stdin :
 

Code :
  1. void purger(void)
  2. {
  3.    int c;
  4.    while ((c = getchar()) != '\n' && c != EOF) {}
  5. }


Donc ton code deviendrait :

Code :
  1. main()
  2. {
  3.  // [...]
  4.  while(rejoue=='o')
  5.  {
  6.      printf("Voulez vous une nouvelle partie?(o/n)\n" );
  7.      scanf("%c",&rejoue);
  8.      // On purge stdin
  9.      purger();
  10.  }
  11. }


Mais comme l'a très justement précisé Joel F il est préférable d'utiliser fgets sur stdin.
Exemple trouvé en deux secondes : http://www.siteduzero.com/tutoriel [...] fgets.html


---------------
-- Debian -- Le système d'exploitation universel | Le gras c'est la vie! | /(bb|[^b]{2})/
Reply

Sujets relatifs:

Leave a Replay

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