Partage
  • Partager sur Facebook
  • Partager sur Twitter

Un problème avec mon "pendu"

Gestion de chaines de caractères

Sujet résolu
    7 août 2006 à 17:53:17

    Salut,

    La création de mon programme du pendu touche à sa fin. Il comporte pour l'instant un mode solo avec un seul mot à découvrir ainsi qu'un mode 2 joueurs.
    Bon un seul mot, on peut le dire..."ça craint", j'ai donc rajouté un dictionnaire pour étayer un peu.

    Pour cela j'ai créé un fichier texte comportant un mot par ligne (rien de bien original) et la fonction juste en dessous le parcours pour choisir aléatoirement un mot.
    Bon, ma fonction tourne a peu près, j'arrive à selectionner un mot au hasard (une fois de temps en temps elle ne selectionne rien...pas bien compris pourquoi encore :o ). Le problème apparait quand je dois enregistrer ce mot et le renvoyer dans la fonction main pour qu'il soit stocké...


    #include "lireDictionnaire.h"
    #define fname "dico.txt"

    #include <stdio.h>
    #include <stdlib.h>


    char lireDictionnaire(void)
    {

        char MotSecret[30] = "";
        char CaractereActuel = 0;
        int CompteurNwl = 0;

        FILE* fp= NULL;
        fp = fopen(fname,"r");




        if (fp == NULL)
        {
             printf("Le fichier dico.txt n'a pas ete ouvert correctement");
             exit(EXIT_FAILURE);
        }
        do
        {
            CaractereActuel = fgetc(fp);
            if (CaractereActuel == '\n') CompteurNwl++;//obtention du nombre de mots

        }while(CaractereActuel != EOF);
        int NbMots = (CompteurNwl+1);

        srand(time(NULL));                             //initialisation du nombre aléatoire
        int NombreAleatoire = ((rand() % NbMots ) + 1);
        int i=1;
        rewind(fp);

        while (i<NombreAleatoire)
        {
            fscanf(fp,"%s",MotSecret);
            i++;

        }

            printf("%s",MotSecret);
            return MotSecret;
    }


    Je veux stocker MotSecret dans un MotSecret défini dans le main...
    J'ai déja essayer des trucs dans le genre:


    MotSecret = lireDictionnaire();
    //ou
    sprintf(MotSecret, lireDictionnaire());


    Mais ça ne donne pas grand chose...

    Un petit coup de main serait le bienvenue :) .
    Merci d'avance à celui qui fera un petit effort pour me répondre.

    • Partager sur Facebook
    • Partager sur Twitter
      8 août 2006 à 13:21:31

      Snif je fête l'anniversaire de mes 12 heures sans réponses :(

      Ca y est ...je déprime. :'( .

      Si il vous manque des infos pour résoudre ce problème surtout n'hésitez pas! Demandez moi! Je rajouterais tous ce que vous voulez.

      Re-Merci d'avance...
      • Partager sur Facebook
      • Partager sur Twitter
        8 août 2006 à 15:07:21

        Il te suffit de retourner un char* et non un char.

        Ainsi dans main tu fais

        char* s = lireDictionnaire();

        Et le tour est joué...

        • Partager sur Facebook
        • Partager sur Twitter
          8 août 2006 à 15:43:58

          Merci de ta réponse, mais ce n'est pas aussi simple que ça :( , en tout cas pour moi...

          J'avais déja essayer de renvoyer un char* mais c'est délicat.
          Je me retrouve avec une autre erreur que je suis incapable de résoudre...
          Pourquoi ce programme ne m'affiche rien...ça me dépasse...pourtant je suis bien la logique des pointeurs (enfin il me semble).


          char lireDictionnaire(void)
          {

              char *MotDico = NULL;
              char CaractereActuel = 0;
              int CompteurNwl = 0;
              int NombreAleatoire;
              int i=1;
              int NbMots= 0;
             
              FILE* fp= NULL;
              fp = fopen(fname,"r");


              if (fp == NULL)
              {
                   printf("Le fichier dico.txt n'a pas ete ouvert correctement");
                   exit(EXIT_FAILURE);
              }
              do
              {
                  CaractereActuel = fgetc(fp);
                  if (CaractereActuel == '\n') CompteurNwl++;//obtention du nombre de mots

              }while(CaractereActuel != EOF);
              NbMots = (CompteurNwl+1);

              srand(time(NULL));                             //initialisation du nombre aléatoire
              NombreAleatoire = ((rand() % NbMots ) + 1);

              rewind(fp);
              while (i<NombreAleatoire)
              {
                  fscanf(fp,"%s",MotDico);
                  i++;

              }

              printf("%s",*MotDico);

          }


          Voilà, j'espère que mon problème commence à ressortir...
          • Partager sur Facebook
          • Partager sur Twitter
            8 août 2006 à 16:39:20

            j'ai une solution plus simple à te proposer, mais ce n'est pas la meilleure
            tu charges toute ta liste de mots dans un tableau, et ensuite dans une autre fonction tu prends une case au hasard
            elle a l'inconvenient de prendre plus de place en memoire, mais ça ne fait pas plus de quelques kilo octets, meme si ta liste est longue

            sinon,
            - c'est un char* qu'il faut renvoyer
            - je ne suis pas sûr que
            while (i<NombreAleatoire)
                {
                    fscanf(fp,"%s",MotDico);
                    i++;

                }

            soit tres correct


            voilà une solution certainement bancale mais qui peut t'aider
            ps: ne jugez pas mon code sur cet echantillon, j'ai fait ça en vitesse


            char* lireDictionnaire(void)
            {

                char MotSecret[30] = "";
                char CaractereActuel = 0;
                int CompteurNwl = 0;
                char* mot;

                FILE* fp= NULL;
                fp = fopen(fname,"r");




                if (fp == NULL)
                {
                     printf("Le fichier dico.txt n'a pas ete ouvert correctement");
                     exit(EXIT_FAILURE);
                }
                do
                {
                    CaractereActuel = fgetc(fp);
                    if (CaractereActuel == '\n') CompteurNwl++;//obtention du nombre de mots

                }while(CaractereActuel != EOF);
                int NbMots = (CompteurNwl+1);

                srand(time(NULL));                             //initialisation du nombre aléatoire
                int NombreAleatoire = ((rand() % NbMots ) + 1);
                int i=1;
                rewind(fp);

                while (i<NombreAleatoire)
                {
                      CaractereActuel = fgetc(fp);
                      if (CaractereActuel == '\n')
                         i++;
                }
                i=0;
                while (CaractereActuel != '\n')
                {
                      MotSecret[i] = CaractereActuel;
                      i++;
                }
                MotSecret[i] = '\\0';
                    sprintf(mot, "%s", MotSecret);
            //      printf("%s",MotSecret);
                    return MotSecret;
                   
                    //et ici, fermeture du fichier, je ne sais plus comment on fait...
                   
            }



            c'est tres loin d'etre parfait, mais ça pourrait t'aider
            en fait, ça m'etonnerait que ça marche, meme o_O
            generalement j'utilise getline de la librairie fstream pour recuperer une entrée d'une liste, quelque soit le caractere delimiteur, et c'est beaucoup plus simple, mais c'est une librairie C++ :-°

            • Partager sur Facebook
            • Partager sur Twitter
              8 août 2006 à 19:39:47

              Citation : Nigel

              generalement j'utilise getline de la librairie fstream pour recuperer une entrée d'une liste, quelque soit le caractere delimiteur, et c'est beaucoup plus simple, mais c'est une librairie C++ :-°



              Avec '\n', fgets() marche très bien...

              Sinon Ardetcho tu déclare une fonction renvoyant un objet de type char et tu ne renvoie rien du tout...
              • Partager sur Facebook
              • Partager sur Twitter
                9 août 2006 à 13:36:22

                Merci pour votre aide, je rédige ma solution en ce début d'apès midi...pas pu faire avant désolé :euh: ...

                Voici le code que j'ai écrit et qui tourne enfin !
                Ma fonction de saisie marche très bien avec scanf et fgets n'est pas nécessaire :) .


                //Dans le main, pour appeler la fonction.

                lireDictionnaire( MotSecret);



                void lireDictionnaire(char *MotDico)
                {

                    char CaractereActuel = 0;
                    int CompteurNwl = 0;
                    int NombreAleatoire;
                    int i=0;
                    int NbMots= 0;

                    FILE* fp= NULL;
                    fp = fopen("dico.txt","r");




                    if (fp == NULL)
                    {
                         printf("Le fichier dico.txt n'a pas ete ouvert correctement");
                         exit(EXIT_FAILURE);
                    }
                    do
                    {
                        CaractereActuel = fgetc(fp);
                        if (CaractereActuel == '\n') CompteurNwl++;//obtention du nombre de mots


                    }while(CaractereActuel != EOF);
                    NbMots = (CompteurNwl+1);

                    srand(time(NULL));                             //initialisation du nombre aléatoire
                    printf("%d",rand());
                    NombreAleatoire = ((rand() % NbMots ) + 1);

                    rewind(fp);

                    while (i<NombreAleatoire)
                    {
                        fscanf(fp,"%s",MotDico);
                        i++;

                    }

                }




                Encore merci pour votre aide :D
                Et surtout bonne continuation à tous !
                • Partager sur Facebook
                • Partager sur Twitter

                Un problème avec mon "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