IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Jeu du pendu - question sur les pointeurs


Sujet :

C

  1. #1
    Candidat au Club
    Homme Profil pro
    programmation
    Inscrit en
    Octobre 2019
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : programmation

    Informations forums :
    Inscription : Octobre 2019
    Messages : 5
    Points : 3
    Points
    3
    Par défaut Jeu du pendu - question sur les pointeurs
    Bonjour,

    À la ligne 23 motChercher[sizeof(motAtrouver)], je me demande pourquoi il n'y a pas d'étoile devant le pointeur motChercher et pourquoi aussi à la ligne 38 où on affiche le mot caché avec printf("%s", motCherche); il n'y a pas d'étoile pour dire que c'est la valeur qu'on veut ?
    Si vous pouviez m'éclairer un peu, ce serait bien parce que j'ai l'impression qu'il y a plusieurs manières d'utiliser les pointeurs. C'est le code source du jeu du pendu en C écrit dans ce site. Et dernière petite question à la ligne où est écris gagne=! strcmp(motAtrouver, motCherche); ça se lit comment s'il n'y a pas de string compare gagne=true ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define TRUE 1
    #define FALSE 0
    char lireCaractere() {
       char chaine[2];
       gets(chaine);
       return chaine[0];
    }
    int main() {
       int i=0;
       int coups=7;
       char motAtrouver[]="BONJOUR";
       char lettreSaisie=' ';
       int lettre_trouvee=FALSE;
       char gagne=FALSE;
       char* motCherche;
       motCherche=malloc (sizeof (motAtrouver));
       memset (motCherche,'*',sizeof (motAtrouver));
       motCherche[sizeof (motAtrouver)-1]=0;
       printf("Jeu de pendu \n");
       do {
          // Aucune lettre trouvée
          lettre_trouvee=FALSE;
          // Saisie d'une lettre et mise en majuscule
          printf("\nVotre lettre : ");
          lettreSaisie=lireCaractere();
          // Comparaison avec le mot secret
          for(i=0; i<strlen (motAtrouver); i++) {
             if(lettreSaisie==motAtrouver[i]) {
                motCherche[i]=lettreSaisie;
                lettre_trouvee=TRUE;
             }
          }
          printf("%s", motCherche); //on affiche le mot cache
          if (!lettre_trouvee) {
             coups--;
          }
          printf("\nIl vous reste %d coups.\n ", coups );
          gagne=! strcmp(motAtrouver, motCherche);
       }
       while(!gagne && coups>0);
       if ( gagne )
          puts ("GAGNE");
       else
          puts ("PERDU");
       getchar();
       free (motCherche);
       return 0;
    }
    Merci.

  2. #2
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 565
    Points : 7 642
    Points
    7 642
    Par défaut
    Bonjour,

    Ligne 23, il n'y a pas de * avant, mais il y a bien un [ après. On utilise l'équivalent pointeur tableau. Un pointeur et un tableau c'est différent mais ils se comportent pareillement en respectant l'équivalence
    *(ptr_ou_tableau + index) <=> ptr_ou_tableau[index]. Si on était dans le cas d'un pointeur qui ne pointe que sur un unique élément, l'équivalence n'a de sens que pour un index nul :
    *ptr_ou_tableau <=> ptr_ou_tableau[0].

    Ligne 38, dans cas "%s" printf veut un paramètre qui pointe sur la chaîne à écrire, il faut donc bien lu passer le pointeur. Si on avait *motCherche on lui transmettrait le 1er caractère et comment la fonction devinerait les autres caractères?

    L'expression gagne=! strcmp(motAtrouver, motCherche); utilise l'autre équivalence du langage C qui dit qu'un nombre nul est considéré faux alors qu'un nombre non nul est considéré vrai.
    • strcmp() retourne 0 si elles sont égales (donc équivalent à FALSE);
    • !strcmp() est l'inverse donc est TRUE si elles sont égales;
    • et c'est ce que l'on met dans gagne qui vaut donc bien TRUE si elles sont égales.
    Ajouter des espaces serait peut-être plus lisible : gagne = ! strcmp(motAtrouver, motCherche);, mais j'utiliserais plutôt l'écriture gagne = (strcmp(motAtrouver, motCherche) == 0);

  3. #3
    Candidat au Club
    Homme Profil pro
    programmation
    Inscrit en
    Octobre 2019
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : programmation

    Informations forums :
    Inscription : Octobre 2019
    Messages : 5
    Points : 3
    Points
    3
    Par défaut Je te remercie beaucoup pour ta réponse
    Ça m'a beaucoup éclairé mais à la ligne 38 je suis bloqué.
    Quand tu dis Ligne 38,
    Citation Envoyé par dalfab Voir le message
    Ligne 38, dans cas "%s" printf veut un paramètre qui pointe sur la chaîne à écrire, il faut donc bien lu passer le pointeur. Si on avait *motCherche on lui transmettrait le 1er caractère et comment la fonction devinerait les autres caractères?
    y a-t-il une règle ou quelque chose qui soit reliée avec un cas comme ça sur Internet parce que je ne trouve rien j'ai l'impression que lorsqu'il s'agit d'un type char pour une chaîne de caractères on n'utilise pas l'étoile.

    Supposons motChercher ne pointe pas sur rien mais a les dimensions de motAtrouver peut être utilisé comme une variable je sais plus je suis emmêlé, la fonction malloc attribue une adresse à motChercher avec la taille de motAtrouver mais est-ce que elle pointe sur motAtrouver ?



    Je pense avoir trouver quelque chose a ce sujet

    Cas des chaines de caractères

    En C , il n’éxiste de type de données pour les chaines de caractères. Les chaines de caractères sont manipulées à l’aide de tableaux de caractères.
    Soit la déclaration suivante :
    char * t = “hello” est équivalente à char t[ 6 ] = “hello”

    permet de déclarer le pointeur t vers le premier caractère de la chaine de caractères. Le pointeur t est utilisé pour accéder à la chaine
    t[0] correspond au caractère h
    t[1] correspond au caractère e etc…
    t[5] correspond au caractère null à la fin

  4. #4
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 565
    Points : 7 642
    Points
    7 642
    Par défaut
    La donnée à transmettre et le format sont liés, il n'y a que 3 formats qui utilisent un pointeur.
    • avec %d %x %X %u %i %o %f %F %e %E %g %G %a %A ou %c printf attend un paramètre simple (entier, flottant ou caractère suivant les cas).
    • avec %s printf attend un pointeur sur une chaîne de caractère;
    • avec %n printf a besoin d'un pointeur pour y inscrire une donnée (rien à voir avec scanf!);
    • avec %p printf va recevoir un pointeur et indiquer sa valeur sans chercher les données pointées.
    Et tu t'es aussi emmêlé dans ta question. Peut-être oublies-tu ce qu'est une variable. Une variable ça contient une donnée, et le pointeur c'est une variable comme les autres sauf que la donnée qu'il contient permet (avec l'étoile) d'accéder à une autre variable. Quand on passe un paramètre à une fonction, elle reçoit cette donnée, et printf ne fera pas mieux qu'une autre fonction, elle n'aura que la valeur transmise par chacun de ses paramètres.
    J'espère t'avoir répondu.

  5. #5
    Candidat au Club
    Homme Profil pro
    programmation
    Inscrit en
    Octobre 2019
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : programmation

    Informations forums :
    Inscription : Octobre 2019
    Messages : 5
    Points : 3
    Points
    3
    Par défaut merci beaucoup pour ton aide
    je vais lire et relire les info que tu ma transmis

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 15/09/2016, 21h41
  2. Une question sur les pointeurs
    Par Chatbour dans le forum Débuter
    Réponses: 2
    Dernier message: 08/09/2010, 09h32
  3. une petite question sur les pointeurs
    Par guy777 dans le forum C
    Réponses: 4
    Dernier message: 06/10/2006, 17h44
  4. Question sur les pointeurs.
    Par Chrisemi dans le forum C++
    Réponses: 5
    Dernier message: 28/10/2005, 23h47
  5. questions sur les pointeurs
    Par Hyoga dans le forum C++
    Réponses: 17
    Dernier message: 08/01/2005, 23h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo