Partage
  • Partager sur Facebook
  • Partager sur Twitter

TP "Le Pendu" cours langage C ( Mathieu Nebra )

bloqué sur la fonction lireCaractère

    14 juin 2021 à 17:29:44

    Je suis bloqué sur la fonction lireCaractère, mon programme ne lit pas la première lettre que je propose quoi qu'il arrive mais il le fait correctement les fois suivantes, je ne comprends pas pourquoi... 

    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    #include <time.h>
    #include <ctype.h>
    #include "LePendu.h"
    #include <string.h>
    
    
    char lireCaractere();
    
    int main(int argc, char const *argv[])
    {
    	char motSecret[] = {"MARRON"};
    	int LongeurMotSecret = strlen(motSecret);
    	int difficulté = 0;
    	char* motRévélé = NULL;
    	char LettreProposée = 0;
    	
    	motRévélé = malloc(LongeurMotSecret * sizeof(char));
    	hide(motRévélé, LongeurMotSecret);
    
    	printf("Bienvenue dans le Pendu !\n");			       //bienvenue
    	printf("Choisissez le nombre d'essais\n"); 
    	scanf("%d", &difficulté);
    
    	while ( difficulté > 0  )                                                     //boucle principale
    	{ 
    		printf("Il vous reste %d coups à jouer !\n", difficulté);   
    		printf("Quel est le mot secret ? %s\n", motRévélé);
    		printf("Proposez une lettre : ");
    		LettreProposée = lireCaractere();
    
    
    		for (int i = 0; i < LongeurMotSecret; ++i)
    		{
    			if (motSecret[i] == LettreProposée)
    			{
    				motRévélé[i] = LettreProposée;
    			}
    		}
    
    	 	difficulté--;
    
    	} 
    
    	return 0;
    }
    
    char lireCaractere()
    {
    	char caractere = 0;
    
    	caractere = getchar();
    	caractere = toupper(caractere);
    
    	while(getchar() != '\n') ;
    
    	return caractere;
    }
    



    • Partager sur Facebook
    • Partager sur Twitter
      14 juin 2021 à 23:30:03

      C'est parce qu'il reste un caractère '\n' dans le buffer clavier.
      • Partager sur Facebook
      • Partager sur Twitter
        15 juin 2021 à 4:25:18

        Après avoir lu la difficulté, tu peux faire:
            fflush(stdin);   // flush le flot d'entrée.
        Pour le malloc:
        + tu dois réserver un espace supplémentaire pour le '\0' (tu dois en tenir compte dans hide() )
        + sizeof(char) est inutile car il vaut toujours 1
        Dans la fonction lireCaractere:
            char caractere = 0;
            caractere = getchar();
        Inutile d'initialiser ici, tu assignes juste après:
            char caractere = getchar();
        • Partager sur Facebook
        • Partager sur Twitter

        Le Tout est souvent plus grand que la somme de ses parties.

          15 juin 2021 à 18:22:22

          Merci beaucoup ! Ca fonctionne comme il faut maintenant, je ne comprends pas pourquoi je n'ai pas rencontré ce problème avec mes précédents scanf() par contre ? est-ce que vous pourriez m'expliquer rapidement cette histoire de flush de buffer et quand faut-il l'utiliser ? Merci encore !
          • Partager sur Facebook
          • Partager sur Twitter
            15 juin 2021 à 19:29:23

            Quand on passe du scanf au getchar() ou autres fonctions du genre, on risque d'avoir ce genre de problème.
            Si on reste avec des scanf, on peut s'en tirer en mettant un espace au début du scanf suivant.
            Le "buffer" est la zone mémoire où sont accumulés les caractères lus du terminal.
            Le fflush efface ce qui se trouve dans cet espace. Ici, c'était le Enter ou '\n'
            • Partager sur Facebook
            • Partager sur Twitter

            Le Tout est souvent plus grand que la somme de ses parties.

            TP "Le Pendu" cours langage C ( Mathieu Nebra )

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown