Partage
  • Partager sur Facebook
  • Partager sur Twitter

Plantage de l'application_Le pendu

copie d'un caractère dans une chaîne pour l'afficher ensuite

Sujet résolu
    14 juin 2019 à 13:31:05

    Bonjour,

    J'ai suivi les tutos du site pour apprendre le C et je bloque à l'amélioration du jeu du Pendu. Je veux afficher les lettres déjà proposées et c'est là que le code coince. La compilation se passe sans problème mais pendant l'exécution du jeu, l'application plante systématiquement lorsqu'il faut afficher les caractères déjà proposées. J'ai bien essayé en concaténant la chaîne et le caractère proposé, ou même de copier la chaîne et j'ai aussi essayé avec sprintf mais je suis dans l'impasse. J'avais eu le même problème lorsque je voulais afficher le nom du joueur (j'ai enlevé cette partie du code) en affectant nomJ2 = "Bernard"; lors de l'affichage avec un printf("%s", nomJ2). J'ai l'impression qu'il y a un problème avec mes chaînes de caractère. Si quelqu'un de se pencher sur mon problème, je vous en remercie d'avance.

    Bonne fin de journée.

    Voici le main.c :

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <ctype.h>
    #include <time.h>
    
    #include "main.h"
    #include "dico.h"
    
    
    
    
    int main(int argc, char *argv[])
    {
    
        int nombreParties = 1;
        int rejouerPartie = 1;
        int scoreJoueur1 = 0;
        int scoreJoueur2 = 0;
        int changerMot = 1;
    
    
        printf("   ----------------------------------------\n");
        printf("  ------------------------------------------\n");
        printf("||                                          ||\n");
        printf("||                  LE PENDU                ||\n");
        printf("||               1 ou 2 joueurs             ||\n");
        printf("||                                          ||\n");
        printf("  ------------------------------------------\n");
        printf("   ----------------------------------------\n");
        printf("          ---------------------------\n");
        printf("                 -------------\n");
        printf("                     -----\n");
    
    
    
        do
        {
                char motSecret[50] = {0};
                int tailleMot = 0;
                int i;
                int *lettreTrouvee = NULL;
    
                int nbJoueurs = 0;
    
    
                do
                {
    
                    printf("\n\n\nTu joues contre un humain ou contre la machine ?\n\n");
                    printf("HUMAIN vs MACHINE -------> Tape 1\n");
                    printf("HUMAIN vs HUMAIN --------> Tape 2\n");
                    nbJoueurs = choixMenu();
    
                    if (nbJoueurs == 1)
                    {
                    if (!piocherMot(motSecret))
                    exit(0);
    
                    }
    
                    else if (nbJoueurs == 2)
                    {
    
                        do
                        {
                    printf("\nJoueur 2 : Choisis un mot a faire deviner :\n");
                    lireEntreeClavier(motSecret, 50);
    
                    tailleMot = strlen(motSecret);
                    for (i=0; i<strlen(motSecret); i++)
                    {
                        motSecret[i]=toupper(motSecret[i]);
                    }
    
                    do
                    {
                    printf("\nTu as ecrit -----> %s. Veux-tu changer le mot ?\n", motSecret);
                    printf("NON ----- > 0\n");
                    printf("OUI ----- > 1\n");
                    changerMot = choixMenu();
                    }while (changerMot !=0 && changerMot !=1);
    
                        if (changerMot)
                            {
                            printf("On recommence...\n\n\n");
                            }
    
                        }while (changerMot != 0);
                    }
    
                    else
                        printf("Faute de frappe !!! On recommence...\n");
    
                }while (nbJoueurs != 1 && nbJoueurs != 2);
    
                tailleMot = strlen(motSecret);
                lettreTrouvee = malloc(tailleMot * sizeof(int));
                if (lettreTrouvee == NULL)
                {exit (0);}
                for (i = 0; i < tailleMot; i++)
                {lettreTrouvee[i] = 0;}
    
                system("cls");
    
                char maLettre = 0;
                int tentativesRestantes = 5;
                int coupsJoues = 1;
                char lettresProposees[26] = {0};
    
                int j = 0;
    
                while (tentativesRestantes > 0 && !gagne(lettreTrouvee, tailleMot))
                                {
                                    printf("\n-----> Partie # %d // Coup # %d\n", nombreParties, coupsJoues);
    
                                    printf("Lettres proposees : ");
    
    
    
                                    for (j = 0 ; j < coupsJoues ; j++)
                                    {printf("%c ", lettresProposees[j]);}
    
    
                                    printf("\n\nJoueur 1 : Tu as %d chances pour trouver le mot mystere.\n", tentativesRestantes);
                                    printf("Quel est le mot secret ? ");
    
                                    for (i = 0 ; i < tailleMot ; i++)
                                        {
                                            if (lettreTrouvee[i])
                                                printf("%c", motSecret[i]);
                                            else
                                                printf("*");
                                        }
    
                                    printf("\nPropose une lettre :\n");
                                    maLettre = lireCaractere();
                                    sprintf(lettresProposees, maLettre);
    
                                    if (!rechercheLettre(maLettre, motSecret, lettreTrouvee))
                                        {
                                        tentativesRestantes--;
                                        }
    
                                    coupsJoues++;
                                }
    
    
                        if (gagne(lettreTrouvee, tailleMot))
                            {scoreJoueur1++;
                            printf("\n\nGagne ! Le mot secret etait bien : %s\n\n\n", motSecret);
                            printf(" ----------------------------- \n");
                            printf("|    Humain    |   Joueur 2   |\n");
                            printf("|-----------------------------|\n");
                            printf("|      %d      |       %d       |\n", scoreJoueur1, scoreJoueur2);
                            printf(" -----------------------------\n");}
    
                        else
                            {scoreJoueur2++;
                            printf("\n\nPerdu ! Le mot secret etait : %s\n\n\n", motSecret);
                            printf(" ----------------------------- \n");
                            printf("|    Humain   |    Joueur 2   |\n");
                            printf("|-----------------------------|\n");
                            printf("|      %d     |        %d       |\n", scoreJoueur1, scoreJoueur2);
                            printf(" -----------------------------\n\n\n");}
    
    
                            free(lettreTrouvee);
    
                            do
                            {
                            printf("\nVeux-tu refaire une partie ?\n");
                            printf("NON ----- > 0\n");
                            printf("OUI ----- > 1\n");
                            rejouerPartie = choixMenu();
    
                            }while (rejouerPartie !=0 && rejouerPartie !=1);
    
                            if (rejouerPartie)
                                    {
                                    printf("On recommence une partie...\n\n\n\n");
                                    nombreParties++;
                                    }
    
                            else
                                    {
                                    printf("\n\n\n////////////////////////////////////////////////////////////////////////\n");
                                    printf("            Merci d avoir joue au Pendu !!! Au revoir !!\n");
                                    printf("//////////////////////////////////////////////////////////////////////////\n\n\n");
                                    return 0;
                                    }
    
        }while (rejouerPartie != 0);
    
        return 0;
    }
    



    • Partager sur Facebook
    • Partager sur Twitter
      14 juin 2019 à 13:45:58

      Ligne 138 ton sprintf n'est pas correcte !
      • Partager sur Facebook
      • Partager sur Twitter
        14 juin 2019 à 13:52:12

        bonjour et merci d’avoir répondu.

        le problème vient de là j’en suis conscient mais je n’arrive pas à copier la lettre proposée (maLettre) dans ma chaîne (lettresProposees) pour l’afficher. Avez-vous une piste ?

        • Partager sur Facebook
        • Partager sur Twitter
          14 juin 2019 à 14:05:55

          Bonjour,

          On peut faire cela avec sprintf(). Tu veux ajouter à la fin de la chaîne la nouvelle lettre. Ça donnerait

          sprintf( chaine+strlen(chaine) , "%c" , lettre );

          On peut aussi, remplacer le terminateur par le nouveau caractère (sachant que le tableau est initialement rempli de '\0', on n'a pas besoin de  déplacer le terminateur) c'est plutôt à éviter.

          chaine[strlen(chaine)] = lettre;
          • Partager sur Facebook
          • Partager sur Twitter

          En recherche d'emploi.

            14 juin 2019 à 14:12:04

            Bon ça marche :) je ne comprends pas bien le strlen dans le sprintf par contre mais merci !
            • Partager sur Facebook
            • Partager sur Twitter
              14 juin 2019 à 14:14:09

              soit tu inserts la lettre à sa position alphabétique dans le tableau (A indice 0), des espaces pour les lettres non piochées et tu affiches le tableau.

              soit tu insert les lettres les une à la suite des autres dans le tableau (il faudra mémoriser avec un compteur ou calculer la position) et tu affiches le tableau.

              • Partager sur Facebook
              • Partager sur Twitter
                14 juin 2019 à 14:31:49

                Merci de votre aide ! Rapide et efficace... :)

                J'en ai profiter pour modifier le code pour afficher le nom du second joueur selon le choix en début de jeu. Voici le code :

                #include <stdio.h>
                #include <stdlib.h>
                #include <string.h>
                #include <ctype.h>
                #include <time.h>
                
                #include "main.h"
                #include "dico.h"
                
                
                
                
                int main(int argc, char *argv[])
                {
                
                    int nombreParties = 1;
                    int rejouerPartie = 1;
                    int scoreJoueur1 = 0;
                    int scoreJoueur2 = 0;
                    int changerMot = 1;
                
                
                    printf("   ----------------------------------------\n");
                    printf("  ------------------------------------------\n");
                    printf("||                                          ||\n");
                    printf("||                  LE PENDU                ||\n");
                    printf("||               1 ou 2 joueurs             ||\n");
                    printf("||                                          ||\n");
                    printf("  ------------------------------------------\n");
                    printf("   ----------------------------------------\n");
                    printf("          ---------------------------\n");
                    printf("                 -------------\n");
                    printf("                     -----\n");
                
                
                
                    do
                    {
                            char motSecret[50] = {0};
                            int tailleMot = 0;
                            int i;
                            int *lettreTrouvee = NULL;
                            char nomJ2[9] = {0};
                            int nbJoueurs = 0;
                
                
                            do
                            {
                
                                printf("\n\n\nTu joues contre un humain ou contre la machine ?\n\n");
                                printf("HUMAIN vs MACHINE -------> Tape 1\n");
                                printf("HUMAIN vs HUMAIN --------> Tape 2\n");
                                nbJoueurs = choixMenu();
                
                                if (nbJoueurs == 1)
                                {
                                sprintf(nomJ2+strlen(nomJ2), "Machine ");
                                if (!piocherMot(motSecret))
                                exit(0);
                
                                }
                
                                else if (nbJoueurs == 2)
                                {
                
                                sprintf(nomJ2+strlen(nomJ2), "Joueur 2");
                                    do
                                    {
                                printf("\nJoueur 2 : Choisis un mot a faire deviner :\n");
                                lireEntreeClavier(motSecret, 50);
                
                                tailleMot = strlen(motSecret);
                                for (i=0; i<strlen(motSecret); i++)
                                {
                                    motSecret[i]=toupper(motSecret[i]);
                                }
                
                                do
                                {
                                printf("\nTu as ecrit -----> %s. Veux-tu changer le mot ?\n", motSecret);
                                printf("NON ----- > 0\n");
                                printf("OUI ----- > 1\n");
                                changerMot = choixMenu();
                                }while (changerMot !=0 && changerMot !=1);
                
                                    if (changerMot)
                                        {
                                        printf("On recommence...\n\n\n");
                                        }
                
                                    }while (changerMot != 0);
                                }
                
                                else
                                    printf("Faute de frappe !!! On recommence...\n");
                
                            }while (nbJoueurs != 1 && nbJoueurs != 2);
                
                            tailleMot = strlen(motSecret);
                            lettreTrouvee = malloc(tailleMot * sizeof(int));
                            if (lettreTrouvee == NULL)
                            {exit (0);}
                            for (i = 0; i < tailleMot; i++)
                            {lettreTrouvee[i] = 0;}
                
                            system("cls");
                
                            char maLettre = 0;
                            int tentativesRestantes = 5;
                            int coupsJoues = 1;
                            char lettresProposees[26] = {0};
                
                            int j = 0;
                
                            while (tentativesRestantes > 0 && !gagne(lettreTrouvee, tailleMot))
                                            {
                                                printf("\n-----> Partie # %d // Coup # %d\n", nombreParties, coupsJoues);
                
                                                printf("Lettres proposees : ");
                
                
                
                                                for (j = 0 ; j < coupsJoues ; j++)
                                                {printf("%c ", lettresProposees[j]);}
                
                
                                                printf("\n\nJoueur 1 : Tu as %d chances pour trouver le mot mystere.\n", tentativesRestantes);
                                                printf("Quel est le mot secret ? ");
                
                                                for (i = 0 ; i < tailleMot ; i++)
                                                    {
                                                        if (lettreTrouvee[i])
                                                            printf("%c", motSecret[i]);
                                                        else
                                                            printf("*");
                                                    }
                
                                                printf("\nPropose une lettre :\n");
                                                maLettre = lireCaractere();
                                                sprintf(lettresProposees+strlen(lettresProposees), "%c", maLettre);
                
                                                if (!rechercheLettre(maLettre, motSecret, lettreTrouvee))
                                                    {
                                                    tentativesRestantes--;
                                                    }
                
                                                coupsJoues++;
                                            }
                
                
                                    if (gagne(lettreTrouvee, tailleMot))
                                        {scoreJoueur1++;
                                        printf("\n\nGagne ! Le mot secret etait bien : %s\n\n\n", motSecret);
                                        printf(" ----------------------------- \n");
                                        printf("|    Humain    |   %s   |\n", nomJ2);
                                        printf("|-----------------------------|\n");
                                        printf("|      %d       |      %d       |\n", scoreJoueur1, scoreJoueur2);
                                        printf(" -----------------------------\n");}
                
                                    else
                                        {scoreJoueur2++;
                                        printf("\n\nPerdu ! Le mot secret etait : %s\n\n\n", motSecret);
                                        printf(" ----------------------------- \n");
                                        printf("|    Humain   |    %s   |\n", nomJ2);
                                        printf("|-----------------------------|\n");
                                        printf("|      %d      |       %d       |\n", scoreJoueur1, scoreJoueur2);
                                        printf(" -----------------------------\n\n\n");}
                
                
                                        free(lettreTrouvee);
                
                                        do
                                        {
                                        printf("\nVeux-tu refaire une partie ?\n");
                                        printf("NON ----- > 0\n");
                                        printf("OUI ----- > 1\n");
                                        rejouerPartie = choixMenu();
                
                                        }while (rejouerPartie !=0 && rejouerPartie !=1);
                
                                        if (rejouerPartie)
                                                {
                                                printf("On recommence une partie...\n\n\n\n");
                                                nombreParties++;
                                                }
                
                                        else
                                                {
                                                printf("\n\n\n////////////////////////////////////////////////////////////////////////\n");
                                                printf("            Merci d avoir joue au Pendu !!! Au revoir !!\n");
                                                printf("//////////////////////////////////////////////////////////////////////////\n\n\n");
                                                return 0;
                                                }
                
                    }while (rejouerPartie != 0);
                
                    return 0;
                }
                



                • Partager sur Facebook
                • Partager sur Twitter

                Plantage de l'application_Le 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