Probléme avec la fonction getchar()

Résolu/Fermé
enigman0001 Messages postés 28 Date d'inscription samedi 30 avril 2016 Statut Membre Dernière intervention 28 décembre 2017 - Modifié le 22 juil. 2017 à 09:17
enigman0001 Messages postés 28 Date d'inscription samedi 30 avril 2016 Statut Membre Dernière intervention 28 décembre 2017 - 22 juil. 2017 à 13:10
bonjour

je suis actuellement entrain de faire un TP langage de programmation c, et le but du TP c'est de réaliser un pendu ( c'est un jeu ou il faut deviner un mot caché ), et j'ai été amené a créer plusieurs fonctions, en particulier une fonction lire_caractere() pour éviter d'utiliser un scanf, a cause la difficulté d'utilisation pour un débutant et surtout pour pouvoir vider le buffet et éviter le mal fonctionnement du programme.
mais voila, le problème est que la fonction lire_caractere() renvoie un '\n' a la place de la lettre que j'ai tapé, et le plus étonnant c'est que ce n'est pas toujours la même chose, plus le programme devient complexe en terme de boucle et de condition plus ma fonction semble faire n'importe quoi.
voila le code, j’espère que quelqu'un pourras me donner une explication, merci pour votre aide.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <time.h>
#include <ctype.h>
#include "les prototypes.h"



char mot_mystere[30] = "";

int main()
{
 int mode_de_jeu = 0, niveau_de_jeu = 0, nombre_de_coups = 0;
 char lettre = 0;

 FILE* test = NULL;

 test = fopen("base_de_donnees.txt", "r+");

if (test != 0)
{
 fclose(test);

 printf("=============== bienvenue au jeu de pendu ================\n\n\n");

 do
 {
  printf("choisissez le mode de jeu\n\n");
  printf("1. mode solo\n");
  printf("2. mode deux joueurs\n\n");
  scanf("%d", &mode_de_jeu);

  switch (mode_de_jeu)
  {
   case 1:
   do
   {
    printf("\nvous avez choisi le mode solo, choisissez le niveau de jeu\n\n");
    printf("1. facile\n");
    printf("2. normal\n");
    printf("3. difficile\n\n");
    scanf("%d", &niveau_de_jeu);

    switch (niveau_de_jeu)
    {
     case 1:
     printf("\nvous avez choisi le niveau facile\n\n");
     printf("il vous reste . coups\n");
     printf("quel est le mot secret ?\n");
     printf("tappez une lettre : ");
     choisir_mot();
     printf("%s", mot_mystere);
     partie();
     break;
     case 2:
     printf("\nvous avez choisi le niveau normal\n\n");
     printf("il vous reste . coups\n");
     printf("quel est le mot secret ?\n");
     printf("tappez une lettre : ");
     break;
     case 3:
     printf("\nvous avez choisi le niveau difficile\n\n");
     printf("il vous reste . coups\n");
     printf("quel est le mot secret ?\n");
     printf("tappez une lettre : ");
     break;
     default:
        printf("il faut tapper le numero 1, 2 ou 3\n\n");
    }
   } while (niveau_de_jeu < 1 || niveau_de_jeu > 3);
   break;
   case 2:
   do
   {
    printf("\nvous avez choisi le mode deux joueurs, choisissez le niveau de jeu\n\n");
    printf("1. facile\n");
    printf("2. normal\n");
    printf("3. difficile\n\n");
    scanf("%d", &niveau_de_jeu);

    switch (niveau_de_jeu)
    {
     case 1:
     printf("\nvous avez choisi le niveau facile\n\n");
     printf("il vous reste . coups\n");
     printf("quel est le mot secret ?\n");
     printf("tappez une lettre : ");
     break;
     case 2:
     printf("\nvous avez choisi le niveau normal\n\n");
     printf("il vous reste . coups\n");
     printf("quel est le mot secret ?\n");
     printf("tappez une lettre : ");
     break;
     case 3:
     printf("\nvous avez choisi le niveau difficile\n\n");
     printf("il vous reste . coups\n");
     printf("quel est le mot secret ?\n");
     printf("tappez une lettre : ");
     break;
     default:
     printf("il faut tapper le numero 1, 2 ou 3\n\n");
    }
   } while (niveau_de_jeu < 1 || niveau_de_jeu > 3);
   break;
   default:
   printf("il faut taper le numero 1 ou 2\n\n");
  }
 } while (mode_de_jeu < 1 || mode_de_jeu > 2);
}
else
{
 printf("impossible d'ouvrir le fichier 'base_de_donnees'\n\n\n");
}



return 0;
}

char lire_caractere()
{
 char caractere = 0;

 caractere = toupper(getchar());

 while(getchar() != '\n');

 return caractere;
}

void choisir_mot()
{
 int nombre_aleatoire = 0, i = 0;
 const int MAX = 10, MIN = 1;

 FILE* fichier = NULL;

 srand(time(NULL));
 nombre_aleatoire = (rand() % (MAX - MIN + 1)) + MIN;

 fichier = fopen("base_de_donnees.txt", "r+");

 if (fichier != NULL)
 {
  while (i < nombre_aleatoire)
  {
   fgets(mot_mystere, 100, fichier);
   i++;
  }
  fclose(fichier);
 }
 else
 {
  printf("operation impossible");
 }
}

void partie()
{
 char mot_a_afficher[30] = "", *test = NULL, *test2 = NULL;
 char caractere = 0;
 int i = 0;

 do
 {
  caractere = lire_caractere();

  test = strchr(mot_mystere, caractere);

  if (test != NULL)
  {
   while (mot_mystere[i] != '\n')
   {
    if (mot_mystere[i] == caractere)
    {
     mot_a_afficher[i] = caractere;
    }
    else
    {
     mot_a_afficher[i] = '*';
    }
    i++;
   }

   printf("%s\n", mot_a_afficher);

   i = 0;

   do
   {
    test2 = strchr(mot_a_afficher, '*');
    if (test2 != NULL)
    {
     printf("bravo, tapez encore une lettre : ");

     do
     {
      caractere = lire_caractere();
      printf("%c\n", caractere);

      test = strchr(mot_mystere, caractere);

      if (test != NULL)
      {
       while (mot_mystere[i] != '\n')
       {
        if (mot_mystere[i] != caractere && mot_a_afficher[i] == '*')
        {
         mot_a_afficher[i] = '*';
        }
        else if (mot_mystere[i] != caractere && mot_a_afficher[i] != '*')
        {

        }
        else
        {
         mot_a_afficher[i] = caractere;
        }
        i++;
       }
       printf("%s\n", mot_a_afficher);
      }
      else
      {
       printf("cette lettre ne se trouve pas dans le mot\n");
       printf("reessayez ! :");
      }
     }while (test == NULL);
    }
    else
    {
    printf("bravo, le mot etait bien %s\n\n", mot_mystere);
    }
    i = 0;
   }while (test2 != NULL);
  }
  else
  {
   printf("cette lettre ne se trouve pas dans le mot\n");
   printf("reessayez ! :");
  }
 }while (test == NULL);
}


EDIT : Ajout des balises de code (la coloration syntaxique).
Explications disponibles ici : ICI

Merci d'y penser dans tes prochains messages.
A voir également:

1 réponse

yg_be Messages postés 22724 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 25 avril 2024 1 476
Modifié le 22 juil. 2017 à 09:19
bonjour, tu écris vouloir éviter d'utiliser scanf, et tu l'utilises malgré tout, sachant que le buffer ne sera pas vidé.
explications ici: la fonction « scan » ne vide pas le tampon
tu te retrouves donc à utiliser scanf suivi de getchar.
je suggère d'utiliser partout fgets().
-6
yg_be Messages postés 22724 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 25 avril 2024 1 476
Modifié le 22 juil. 2017 à 09:48
ou bien:
char c;

while ( ( caractere = getchar() ) == '\n' )

while ( ((c = getchar()) != '\n') && c != EOF);

return toupper(caractere);
0
enigman0001 Messages postés 28 Date d'inscription samedi 30 avril 2016 Statut Membre Dernière intervention 28 décembre 2017 > yg_be Messages postés 22724 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 25 avril 2024
22 juil. 2017 à 10:30
bonjour, merci pour cette réponse

vus que je ne peut pas utiliser ma fonction pour récupérer un nombre, j'ai utilisé un scanf au début du programme, et je ne me suis pas inquiété plus que ça puisque elle avait l'air de bien marcher au début du programme, c'est plus loin que le problème apparaît, mais je pense que je vais utiliser partout ma fonction et demander a l'utilisateur de taper des lettres aulieu de nombre je pense que c'est mieux.

pour la deuxième ligne de ton code, pourrais tu expliquer si ça ne te dérange pas ?

et pour fgets(), c'est une fonction de récupération de chaîne dans un fichier non ? comment je pourrais l'utiliser ici ?
0
yg_be Messages postés 22724 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 25 avril 2024 1 476 > enigman0001 Messages postés 28 Date d'inscription samedi 30 avril 2016 Statut Membre Dernière intervention 28 décembre 2017
22 juil. 2017 à 11:30
fgets peut-être utilisé pour lire les entrées de l'utilisateur, c'est en fait traité comme un fichier particulier.

le premier while lit un caractère, et l'enregistre dans "caractere". il refait cela tant que le caractère obtenu est '\n'. après cette instruction, tu as donc dans caractère le premier caractère différent de '\n'.
0
enigman0001 Messages postés 28 Date d'inscription samedi 30 avril 2016 Statut Membre Dernière intervention 28 décembre 2017 > yg_be Messages postés 22724 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 25 avril 2024
22 juil. 2017 à 13:10
merci pour cette explication
0