logo Debian Debian Debian-France Debian-Facile Debian-fr.org Forum-Debian.fr Debian ? Communautés logo inclusivité

Debian-facile

Bienvenue sur Debian-Facile, site d'aide pour les nouveaux utilisateurs de Debian.

Vous n'êtes pas identifié(e).

#1 04-04-2011 10:04:42

dbkblk
Membre
Distrib. : Debian Wheezy 64bits
Noyau : 3.2
(G)UI : Gnome 3.2
Inscription : 24-10-2010

[Résolu] [Langage C] Erreur de débutant... (--> Numérotation)

Bonjour,
J'apprend le langage C depuis un petit moment déjà grâce à l'excellent tutorial de siteduzero.com et j'en suis à la partie où je dois réaliser mon propre jeu de pendu (avec un mot fixé à l'avance pour l'instant). J'ai cherché pendant plusieurs jours mon erreur mais je dois avouer que je ne la trouve pas. Evidemment, j'ai regardé sa solution et je comprend tout à fait la méthode mais je l'ai écrit différemment et j'obtiens un truc bizarroïde.

Voici le code (assez simple):

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h> // Biblio pour getchar()
#include <string.h> // Bibliothèque de manipulation des chaines


/* Règles du jeu de pendu:
 * Trouver le mot caché en moins de 10 coups */
 
char lireCaractere();
char rechercheCaractere(char mot_cible[], char lettre_cible[]);
char decouverteMotEtoile(char motSecret[], char motEtoile[], char lettre[]);

int main(int argc, char **argv)
{
  // Mot secret fixé avant le dictionnaire
  char motSecret[] = "ESTUAIRE";
 
  // Initialisation des différentes variables
  char lettre_entree[] = "a";
  int compteur = 10;
  char motEtoile[] = "                                    ";
  int i = 0;
  int longueur = 0;
 
 
  // Génération du mot étoile
  longueur = strlen(motSecret);
  for (i = 0 ; i <= longueur; i++)
    {
        motEtoile[i] = '*';
    }

 
  // Boucle de récupération de la lettre
  while (compteur > 0)
  {
    printf("Quel est le mot secret ? %s\n Proposez une lettre: ", motSecret);
    *lettre_entree = lireCaractere();
    decouverteMotEtoile(motSecret, motEtoile, lettre_entree);
    printf("%s", motEtoile);
    if(rechercheCaractere(motSecret, lettre_entree) == 0)
    {
      compteur--;
    }
    printf("Il vous reste %d coups !\n\n", compteur);
  }

 
  return 0;
}

// Acquisition de caractère

char lireCaractere()
{
    char caractere = 0;
 
    caractere = getchar(); // On lit le premier caractère
    caractere = toupper(caractere); // On met la lettre en majuscule si elle ne l'est pas déjà
 
    // On lit les autres caractères mémorisés un à un jusqu'à l'\n (pour les effacer)
    while (getchar() != '\n') ;
 
    return caractere; // On retourne le premier caractère qu'on a lu

}


// Fonction de recherche du caractère dans le mot secret

char rechercheCaractere(char mot[], char lettre[])
{
  //~ char mot[] = "MARRON";
  //~ char lettre[] = "R";
  char *temp = NULL;
  int compteur_lettredumot = 0;
 
  temp = strpbrk (mot, lettre);
 
  if (temp != NULL)
  {
    while (temp != NULL)
    {
   
      temp = strpbrk (temp+1, lettre);
      compteur_lettredumot++;
     
    }
    printf("Effectivement, il y avait %d %s ! \n", compteur_lettredumot, lettre);
  }
 
  if (compteur_lettredumot == 0)
  {
    printf("Non, il n'y avait pas de %s ! \n", lettre);
    return 0;
  }
 
  return 1;
}


// Fonction de découverte du mot secret (transformation des étoiles par les lettres trouvées)

char decouverteMotEtoile(char motSecret[], char motEtoile[], char lettre[])
{
  int i = 0;
  for (i = 0 ; i <= strlen(motSecret) ; i++)
    {
        if ( *lettre == motSecret[i] )
        {
      motEtoile[i] = motSecret[i];
    }
    }
  printf("%s", motEtoile);
  return 1;
}


J'arrive à générer un mot caché et chacune des parties du code marche séparément. Pourtant, quand je rentre une lettre correcte, il m'affiche n'importe quoi. Pourriez vous m'aider à trouver l'erreur ? Je pense qu'elle se cache parmis les pointeurs ou la gestion des tableaux.

Dernière modification par dbkblk (06-04-2011 06:55:20)


M. Gandhi: "C'est une erreur de croire nécessairement faux ce qu'on ne comprend pas."
C'est quoi ce bordel ?

Hors ligne

#2 05-04-2011 21:34:47

zoroastre74
Membre
Distrib. : Debian Wheezy
Noyau : Linux 3.2
(G)UI : Awesome wm v3.4.13 (Octopus)
Inscription : 28-08-2010

Re : [Résolu] [Langage C] Erreur de débutant... (--> Numérotation)

Yep!

J'ai un comportement différent du tiens.

Premio, le mot de passe n'est pas masqué :

Il faudrait modifié ceci je pense afin de prendre en compte la longueur du mot caché :

char motEtoile[] = "                                    ";



Deuzio :

    //for (i = 0 ; i <= longueur; i++)
    for (i = 0 ; i < longueur; i++)


Comme on commence à 0, la longueur réelle est égale à la longueur -1.

Troizio, je n'ai pas le comportement que tu cites avec :

gcc -Wall -o "pendu" "pendu.c"


Je continue à jeter un coup d'oeil à ton script wink

@+

Zoroastre.

Dernière modification par zoroastre74 (05-04-2011 22:06:07)

Hors ligne

#3 05-04-2011 21:48:41

zoroastre74
Membre
Distrib. : Debian Wheezy
Noyau : Linux 3.2
(G)UI : Awesome wm v3.4.13 (Octopus)
Inscription : 28-08-2010

Re : [Résolu] [Langage C] Erreur de débutant... (--> Numérotation)

Yep !

Tout bon pour moi.

Au fait, désolé pour le temps de réponse, la programmation réclame du temps. wink

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h> // Biblio pour getchar()
#include <string.h> // Bibliothèque de manipulation des chaines


/* Règles du jeu de pendu:
 * Trouver le mot caché en moins de 10 coups */
 
char lireCaractere();
char rechercheCaractere(char mot_cible[], char lettre_cible[]);
char decouverteMotEtoile(char motSecret[], char motEtoile[], char lettre[]);

int main(int argc, char **argv)
{
    // Mot secret fixé avant le dictionnaire
    char motSecret[] = "ESTUAIRE";
   
    // Initialisation des différentes variables
    char lettre_entree[] = "a";
    int compteur = 10;
    char motEtoile[] = "                                    ";
    int i = 0;
    int longueur = 0;
   
   
    // Génération du mot étoile
    longueur = strlen(motSecret);
    //for (i = 0 ; i <= longueur; i++)
    for (i = 0 ; i < longueur; i++)
    {
        motEtoile[i] = '*';
    }

   
    // Boucle de récupération de la lettre
    while (compteur > 0)
    {
        //printf("Quel est le mot secret ? %s\n Proposez une lettre: ", motSecret);
        printf("Quel est le mot secret ? \n Proposez une lettre: ");
        *lettre_entree = lireCaractere();
        decouverteMotEtoile(motSecret, motEtoile, lettre_entree);
        //printf("%s", motEtoile);
        if(rechercheCaractere(motSecret, lettre_entree) == 0)
        {
            compteur--;
        }
        printf("Il vous reste %d coups !\n\n", compteur);
    }

   
    return 0;
}

// Acquisition de caractère

char lireCaractere()
{
    char caractere = 0;
 
    caractere = getchar(); // On lit le premier caractère
    caractere = toupper(caractere); // On met la lettre en majuscule si elle ne l'est pas déjà
 
    // On lit les autres caractères mémorisés un à un jusqu'à l'\n (pour les effacer)
    while (getchar() != '\n') ;
 
    return caractere; // On retourne le premier caractère qu'on a lu

}


// Fonction de recherche du caractère dans le mot secret

char rechercheCaractere(char mot[], char lettre[])
{
    //~ char mot[] = "MARRON";
    //~ char lettre[] = "R";
    char *temp = NULL;
    int compteur_lettredumot = 0;
   
    temp = strpbrk (mot, lettre);
   
    if (temp != NULL)
    {
        while (temp != NULL)
        {
       
            temp = strpbrk (temp+1, lettre);
            compteur_lettredumot++;
           
        }
        printf("Effectivement, il y avait %d %s ! \n", compteur_lettredumot, lettre);
    }
   
    if (compteur_lettredumot == 0)
    {
        printf("Non, il n'y avait pas de %s ! \n", lettre);
        return 0;
    }
   
    return 1;
}


// Fonction de découverte du mot secret (transformation des étoiles par les lettres trouvées)

char decouverteMotEtoile(char motSecret[], char motEtoile[], char lettre[])
{
    int i = 0;
    //for (i = 0 ; i <= strlen(motSecret) ; i++)
    for (i = 0 ; i < strlen(motSecret) ; i++)
    {
        if ( *lettre == motSecret[i] )
        {
            motEtoile[i] = motSecret[i];
        }
    }
    printf("%s", motEtoile);
    return 1;    
}


Bon à part une relecture de for, c'est ok. Lorsque l'on compte de 0 à 9, on obtient 10. "estuaire" contient 8 lettres (renvoyé par strlen), donc il faut compter de 0 à 7.

J'espère que ce sera fonctionnel chez toi smile

@+

Zoroastre.

Dernière modification par zoroastre74 (05-04-2011 22:08:46)

Hors ligne

#4 06-04-2011 06:46:24

dbkblk
Membre
Distrib. : Debian Wheezy 64bits
Noyau : 3.2
(G)UI : Gnome 3.2
Inscription : 24-10-2010

Re : [Résolu] [Langage C] Erreur de débutant... (--> Numérotation)

Merci beaucoup ! Ca fonctionne !

J'y crois pas ! J'ai passé autant de temps à chercher pour une erreur aussi conne ! Je commençais à me demander si j'avais pas fais plein d'erreurs.
En tout cas merci pour l'explication sur la numérotation, parce que je pense que j'avais mal compris ce passage.

La programmation c'est assez passionnant mais quand on trouve pas son erreur c'est pénible (la compilation ne m'en affichait aucune et je la trouvais pas).

Grâce à toi je vais pouvoir continuer mon voyage didactique !

Amicalement,

H.

M. Gandhi: "C'est une erreur de croire nécessairement faux ce qu'on ne comprend pas."
C'est quoi ce bordel ?

Hors ligne

Pied de page des forums