Les pointeurs en langage C

Résolu/Fermé
limbergh Messages postés 658 Date d'inscription dimanche 8 juillet 2007 Statut Membre Dernière intervention 29 juin 2010 - 4 avril 2008 à 23:53
limbergh Messages postés 658 Date d'inscription dimanche 8 juillet 2007 Statut Membre Dernière intervention 29 juin 2010 - 5 avril 2008 à 10:08
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 2435 Date d'inscription jeudi 1 novembre 2007 Statut Membre Dernière intervention 16 août 2010 436
5 avril 2008 à 01:29
ç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 921 Date d'inscription lundi 21 janvier 2008 Statut Membre Dernière intervention 6 mars 2012 131
5 avril 2008 à 02:40
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 658 Date d'inscription dimanche 8 juillet 2007 Statut Membre Dernière intervention 29 juin 2010 140
5 avril 2008 à 10:08
merci pour vos réponses!!!
0