Les pointeurs en langage C

Résolu
limbergh Messages postés 669 Statut Membre -  
limbergh Messages postés 669 Statut Membre -
Bonsoir,
j'ai commencer un jeu de pendu, avec lequelle j'ai fait une fonction incrémentation quand le joueur trouve une lettre pour ne pas que son quota de coup diminue si il trouve la bonne lettre. Cette fonction fonctionne très bien avec des variables globales mais dès que je veux utiliser des variables locales avec des pointeurs ma fonction ne fonctionne plus...
je met ici mon code avec les variables globales (celui qui fonctionne), si quelqu'un à une idée pour faire avec des variables locales, je suis preneur pour des explications...

Merci d'avance

Voici mon code
#include <stdio.h>
#include <stdlib.h>
void compteur( char a);
char mot_a_trouve[5]; 
char mot[5];//mot introduit
int nbessai=10;
int  choix, i;
 char lc;//lettre composée
int main(int argc, char *argv[])
{
    
 


 
 
  for(i=0;i<=5;i++)
  mot_a_trouve[i]='*';

     
  do
  {
  printf("\n\n-1- choisissez un mot!!! : ");
  printf("\n-2- affichez le mot choisi!!! : ");
  printf("\n-3- tapez une lettre : ");
  printf("\n votre choix==============>");
  scanf("%d", &choix);
  getchar();
  switch(choix)
  {
  case 1 :
       printf("introduisez un mot de 6 caracteres : ");
       scanf("%s", &mot);
       break;

  case 2 :
       printf("\n\nle mot choisi est : %s" , mot);
       break;

  case 3 :
       printf("\n =====LE PENDU=======");
       
       for (nbessai=10;nbessai>0;nbessai--)
{
       printf("\n il vous reste %d coups a jouer", nbessai);

       printf("\n introduisez une lettre : ");
       scanf("%c", &lc);
       getchar();
       for (i=0;i<=5;i++)
       {
       if (lc==mot[i])
            mot_a_trouve[i]=lc;
       compteur(lc);
            
       }
    for(i=0;i<=5;i++)
        printf("%c",mot_a_trouve[i]);
        
}
       break;
   }
}
while(choix!=0);
system("PAUSE");
return 0;
}
void compteur( char a)
{
if(a==mot[i])
{
nbessai++;
}
else{}
}
A voir également:

3 réponses

mype Messages postés 2449 Statut Membre 437
 
ça m'etonne que ton code actuel marche il y a quelques erreurs dedans
comme tu demandes des mots de 6 lettres il te faudrais des tableau de taille 6 et pas 5 dans les declaration
ensuite il te faut changer aussi tes boucle for a ce moment
ton scanf pour stocké le mot n'est pas correct il n'y a pas de "&" puisque mot est un tableau
ensuite ton systeme de rajouter un essai quand la lettre est trouvé ne va pas fonctionné dans tous les cas imagine que l'utilisateur trouve deux fois de suite la lettre a ce moment il verra son nombre d'essai augmenté il pourra meme obtenir 12essais...
enfin je te conseille plutot une boucle while avec une variable trouve pour deduire si on doit diminué le nombre d'essais ou pas

voila essayes comme ça ça devrait aller
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
    
 char mot_a_trouve[6]; 
char mot[6];//mot introduit
int nbessai=10;
int  choix, i;
 char lc;//lettre composée
int trouve=0;

 
 
  for(i=0;i<6;i++)
  mot_a_trouve[i]='*';

     
  do
  {
  printf("\n\n-1- choisissez un mot!!! : ");
  printf("\n-2- affichez le mot choisi!!! : ");
  printf("\n-3- tapez une lettre : ");
  printf("\n votre choix==============>");
  scanf("%d", &choix);
  getchar();
  switch(choix)
  {
  case 1 :
       printf("introduisez un mot de 6 caracteres : ");
       scanf("%s", mot);
       break;

  case 2 :
       printf("\n\nle mot choisi est : %s" , mot);
       break;

  case 3 :
       printf("\n =====LE PENDU=======");
       
       while (nbessai>0)
{
       printf("\n il vous reste %d coups a jouer", nbessai);
	trouve=0;
       printf("\n introduisez une lettre : ");
       scanf("%c", &lc);
       getchar();
       for (i=0;i<6;i++)
       {
       if (lc==mot[i]){
            mot_a_trouve[i]=lc;
       trouve++;}
            
       }
if(trouve==0)
nbessai=nbessai-1;

    for(i=0;i<6;i++)
        printf("%c",mot_a_trouve[i]);
        
}
       break;
   }
}
while(choix!=0);
system("PAUSE");
return 0;
}
0
cchristian Messages postés 928 Statut Membre 131
 
Bonsoir

En complément au post de Mype,

#include<stdio.h> 
#include<conio.h> 
*/
// J'ai fait un test de fonctionnement portant sur la correction relative
// aux passations de valeurs, je n'ai pas poussé les tests sur l'aspect cohérence de 
// fonctionnement du problème traité par ce programme. 
#include <stdio.h>
#include <stdlib.h>

// (voir compteur) 
void compteur( char *a, int *i, char (*mot), int *nb_essai);

int main(int argc, char *argv[])
{
//J'ai agrandi les tableaux (par précaution).
char mot_a_trouve[16]; 
char mot[16];//mot introduit
int nbessai=10;
int  choix, i;
 char lc;//lettre composée

// Là tu débordais du tableau avec 5 éléments lorsque dans la boucle
//  i est = 5 en partant de 0 tu es sur le 6ième élément du tableau.
// Pour char mot_a_trouve [5] = "0123"; tu ne disposes que de 4
// éléments utiles indicés par des valeurs d'indice allant de 0 0à 3.
// le 5ième (le dernier, ici valeur d'indice 4) est "réservé" à '\0'.
// Pour s'en persuader fait : char mot_a_trouve [5] = "0123", puis
// tu compiles il n'y aura pas d'erreur, ajoute un caractère :
// char mot_a_trouver [5] = "01234"; tu auras ce type de message :
// "'mot_a_trouver' : dépassement des limites du tableau".

  for(i=0;i<=5;i++)
  mot_a_trouve[i]='*';
  do
    {
     printf("\n\n-1- choisissez un mot!!! : ");
     printf("\n-2- affichez le mot choisi!!! : ");
     printf("\n-3- tapez une lettre : ");
     printf("\n votre choix==============>");
     scanf("%d", &choix);
     getchar();
     switch(choix)
       {
       case 1 :
            printf("introduisez un mot de 6 caracteres : ");
            scanf("%s", &mot);
            break;

       case 2 :
            printf("\n\nle mot choisi est : %s" , mot);
            break;

       case 3 :
            printf("\n =====LE PENDU=======");
       
           for (nbessai = 10; nbessai > 0; nbessai--)
            {
              printf("\n il vous reste %d coups a jouer", nbessai);
              printf("\n introduisez une lettre : ");
              scanf("%c", &lc);
              getchar();
// Idem (débordement)
              for (i = 0; i <= 5; i++)
                {
                 if (lc==mot[i])
                    mot_a_trouve[i]=lc;
// rappel :
// & : obtention de l'adresse d'un objet occupant un emplacement
// de la memoire. (mot_a_trouve est dirrectement l'adresse du 
//  début du tableau, donc pas de &)
                   compteur(&lc, &i, mot_a_trouve, &nbessai);
               }
// Idem (débordement)
             for (i = 0; i <= 5; i++)
                printf("%c",mot_a_trouve[i]);
        
            }
       break;
       }
    }
  while(choix!=0);
  system("PAUSE");
  return 0;
  }

// rappel :
//L'expression *x signifie : acces a l'emplacement memoire
//  dont x contient l'adresse (donc au contenu de x).
  void compteur( char *a, int *i, char (*mot), int *nbessai)
  {
//Attention : tu modifies ici nbessai qui est utilisé dans la
// boucle  for (nbessai=10;nbessai>0;nbessai--),c'est dangereux. 
    if (*a==mot[*i])
      {
       nbessai++;
      }
// Inutile
//else{}
  }
0
limbergh Messages postés 669 Statut Membre 140
 
merci pour vos réponses!!!
0