Partage
  • Partager sur Facebook
  • Partager sur Twitter

PENDU

copie d'une chaine dans un fichier

Sujet résolu
    18 mars 2018 à 23:56:22

    Bonjour,

    Voici mon probleme:

    1  Dans ma fonction "motAuHasard" je lis une chaine de caractere pour la copier, mais j'ai remarquer que je copie a chaque fin de mot la touche "entré". Comme si la fonction fgets lisais le retour à la ligne..

    2  J'ai un autre soucis.. quand le joueur touve un lettre qui est en double dans le mot, il bénéficie d'un coup supplémentaire.. Un indice ?

    Voici mon code:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <time.h>
    
    char        lireCaractere();
    void        motAuHasard(char *mot);
    void        transformeMot(char *mot, char *motTransformer);
    void        trouveMot(char *mot, char *motTransformer);
    
    
    int main(int argc, char *argv[])
    {
        char mot[10] = "";
        char motTransformer[10] = "";
    
        motAuHasard(&mot);
        transformeMot(&mot, &motTransformer);
        trouveMot(&mot, &motTransformer);
    
        return 0;
    }
    
    char        lireCaractere()
    {
        char caractere = 0;
    
        caractere = getchar(); // On demande à l'utilisateur sa lettre
        caractere = toupper(caractere); // Transforlation en Majuscule
    
        while (getchar() != '\n'); // On efface les prochain caractere
    
        return caractere;
    }
    
    void        motAuHasard(char *mot)
    {
        int i;
        int nombreMystere = 0;
        const int MAX = 10, MIN = 1;
    
        srand(time(NULL));
        nombreMystere = (rand() % (MAX - MIN + 1)) + MIN;
    
        FILE* fichier = NULL;
    
        fichier = fopen("DMots.txt", "r");
        if (fichier != NULL)
        {
            for(i = 0; i != nombreMystere; i++)
                fgets(mot, 10, fichier);
            printf("%s", mot);
            fclose(fichier);
        }
    }
    
    void        transformeMot(char *mot, char *motTransformer)
    {
        int i = 0;
    
        strcpy(motTransformer, mot);
    
        for(i=0;motTransformer[i]!='\0';i++)
            motTransformer[i] = '*';
    }
    
    void        trouveMot(char *mot, char *motTransformer)
    {
        int i = 0;
        int u = 10;
        char lettreUtilisateur = 0;
    
        printf("Trouve le mot secret\n%s \n", motTransformer);
        do
            {
                lettreUtilisateur = lireCaractere();
                for(i=0;mot[i] != '\0';i++)
                {
                    if (lettreUtilisateur == mot[i] && motTransformer[i] == '*')
                    {
                        motTransformer[i] = lettreUtilisateur;
                        if (strcmp(motTransformer, mot) == 0)
                        {
                            printf("Bravo tu as fini le jeu ! Le mot est bien %s \n", mot);
                            return;
                        }
                        u++;
                    }
                }
                u--;
    
                printf("il te reste %d coups %s\n",u ,motTransformer);
            }while(u>0);
    }
    

    Mon dictionaire de mots est constitué de cette façon la: 

    MOTS

    MOTS

    ...

    Merci pour vos réponse.

    • Partager sur Facebook
    • Partager sur Twitter
      19 mars 2018 à 9:22:25

      Salut,

      `fgets` s'arrête au premier saut de ligne trouvé (et l'enregistre). C'est le comportement de base de cette fonction.

      Pour régler ce problème, il faut systématiquement que tu remplace le dernier caractère de la chaîne obtenue (le saut de ligne) par un '\0'.

      • Partager sur Facebook
      • Partager sur Twitter
      Hugo
        19 mars 2018 à 9:24:25

        Salut. Pour fgets c'est expliqué dans le cours, il y a effectivement le caractère de fin de ligne qui est lu en plus.

        mot[strlen(mot) - 1] = '\0'

        En plus il y a quelques coquilles dans ton code. Dans la fonction "main"(lignes 17 à 19) tu n'as pas besoin de mettre "&" devant les chaines que tu passes aux fonctions(d'ailleurs tu as forcément un warning à ce sujet, non?). La ligne 61 ne sert pas vraiment, tu peux l'enlever et utiliser strlen(mot) dans la boucle!


        Que veux tu dire par coup supplémentaire?

        Edit:grillé

        -
        Edité par kulturman 19 mars 2018 à 9:24:53

        • Partager sur Facebook
        • Partager sur Twitter
          19 mars 2018 à 9:57:49

          Yo,

          Pour le coup supplémentaire, il faut que tu change la façon dont tu décrémente ta variable u en utilisant une variable tierce  pour vérifier que la lettre trouvée est bonne ou non

          et faire une verif vers la fin du do//while genre 

          if(verif != 1) u--;
          verif = 0;
          • Partager sur Facebook
          • Partager sur Twitter
            20 mars 2018 à 12:54:33

            Merci pour vos réponse !

            J'ai fais les changements et effectivement ça marche parfaitement bien =).

            Par contre Kulturman, j'ai pas effacer la ligne 61, j'ai bien compris ce que tu voulais me faire comprendre, mais la méthode que j'ai utilisé est tout aussi viable je pense.

             je vous repasse le code fini avec vos modifications.

            #include <stdio.h>
            #include <stdlib.h>
            #include <string.h>
            #include <time.h>
            #define TAILLE 15
            
            char        lireCaractere();
            void        motAuHasard(char *mot);
            void        transformeMot(char *mot, char *motTransformer);
            void        trouveMot(char *mot, char *motTransformer);
            
            
            int main(int argc, char *argv[])
            {
                char mot[TAILLE] = "";
                char motTransformer[TAILLE] = "";
            
                motAuHasard(mot);
                transformeMot(mot, motTransformer);
                trouveMot(mot, motTransformer);
            
                return 0;
            }
            
            char        lireCaractere()
            {
                char caractere = 0;
            
                caractere = getchar(); // On demande à l'utilisateur sa lettre
                caractere = toupper(caractere); // Transforlation en Majuscule
            
                while (getchar() != '\n'); // On efface les prochain caractere
            
                return caractere;
            }
            
            void        motAuHasard(char *mot)
            {
                int i;
                int nombreMystere = 0;
                const int MAX = TAILLE, MIN = 1;
            
                srand(time(NULL));
                nombreMystere = (rand() % (MAX - MIN + 1)) + MIN;
            
                FILE* fichier = NULL;
            
                fichier = fopen("DMots.txt", "r");
                if (fichier != NULL)
                {
                    for(i = 0; i != nombreMystere; i++)
                    {
                        fgets(mot, TAILLE, fichier);
                    }
                    mot[strlen(mot) - 1] = '\0';
                    fclose(fichier);
                }
            }
            
            void        transformeMot(char *mot, char *motTransformer)
            {
                int i = 0;
            
                strcpy(motTransformer, mot);
            
                for(i=0;motTransformer[i]!='\0';i++)
                    motTransformer[i] = '*';
            }
            
            void        trouveMot(char *mot, char *motTransformer)
            {
                int i = 0;
                int u = 10;
                int verif = 0;
                char lettreUtilisateur = 0;
            
                printf("Trouve le mot secret\n%s \n", motTransformer);
                do
                    {
                        lettreUtilisateur = lireCaractere();
                        for(i=0;mot[i] != '\0';i++)
                        {
                            if (lettreUtilisateur == mot[i] && motTransformer[i] == '*')
                            {
                                motTransformer[i] = lettreUtilisateur;
                                verif++;
                                if (strcmp(motTransformer, mot) == 0)
                                {
                                    printf("Bravo tu as fini le jeu ! Le mot est bien %s \n", mot);
                                    return;
                                }
                                else if (verif > 2)
                                {
                                    u--;
                                    verif = 0;
                                }
                                u++;
                            }
                        }
                        u--;
            
                        printf("il te reste %d coups %s\n",u ,motTransformer);
                    }while(u>0);
            }
            



            • Partager sur Facebook
            • Partager sur Twitter

            PENDU

            × 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