Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème avec le pendu en C

Sujet résolu
    13 janvier 2019 à 1:10:55

    Bonjour tout le monde. Je viens vers vous parce qu'après avoir cogité pendant pas mal de temps sur le TP2 du cours sur le langage C, le code le plus abouti auquel je suis parvenu est:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <ctype.h>
    
    char read();
    int main(int argc, char *argv[]){
    
    int i=0, life=3;
    char secret[]="******", word[]="MARRON", letter=' ';
    
    while(secret!=word && life>0){
    
        printf("%s\nEntrer une lettre: ",secret);
        letter = read();
    
    if(strchr(word,letter)!=NULL){
       for(i=0;i<6;i++)
         if(word[i]==letter){
             secret[i]=word[i]; //la lettre correcte remplace les *
        }
    }
    
    else{
        life--;
        printf("\n%d vies restantes \n",life);
    }
    
    }
    
    
    if(life==0){
        printf("meh");  //perdu
    }
    
    else{
        printf("nice"); //gagné
    }}
    
    
    char read(){
    
    char c=0;
    
    c = getchar();
    c = toupper(c);
    
    while(getchar()!= '\n');
    
    return c;
    }
    

    Le problème est que lors de l'exécution, même lorsque les deux chaînes "secret" et "word" deviennent égales, le programme ne sort pas de la boucle et continuer à demander des lettres à rentrer. La seule chose à faire pour qu'il en sorte est que le nombre de coups restants "life" atteigne 0. Concrètement ça donne ça:


    Où est-ce que je me suis raté ?

    Merci d'avance ^^

    -
    Edité par Youssef Emrani 13 janvier 2019 à 1:18:32

    • Partager sur Facebook
    • Partager sur Twitter
      13 janvier 2019 à 1:45:59

      Bonsoir,

      Le problème vient de la comparaison des chaînes de caractères !

      Chaine1 =! Chaine2 cela veut dire est ce que le pointeur chaine1 est différent du pointeur chaîne2 ( ça sera toujours vrai c'est pour ça que tu sors pas de ta boucle )

      Pour comparer des chaînes de caractères, sers toi de strcmp dans string.h strcmp(chaine1,chaîne2) == 0 alors les chaînes sont égales ( je crois )

      -
      Edité par MrsSniperMrsniper 13 janvier 2019 à 8:05:31

      • Partager sur Facebook
      • Partager sur Twitter
        13 janvier 2019 à 1:59:53

        Hello,

        MrsSniperMrsniper a écrit:

        Pour comparer des chaînes de caractères, sers toi de strcat dans string.h strcat(chaine1,chaîne2) == 0 alors les chaînes sont égales ( je crois )

        Pas strcat(), mais strcmp()

        @Golden_Fire:

        • attention que getchar() et toupper() renvoient un int. Donc c'est int c et int read()....
        • .... mais read() est une fonction qui existe en C (dans io.h)
        • l'indentation est à revoir.

        -
        Edité par edgarjacobs 13 janvier 2019 à 2:14:32

        • Partager sur Facebook
        • Partager sur Twitter

        On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

          14 janvier 2019 à 20:01:50

          Merci beaucoup pour vos réponses ! Ca a résolu le problème que j'avais

          edgarjacobs a écrit:

          • attention que getchar() et toupper() renvoient un int. Donc c'est int c et int read()....
          • .... mais read() est une fonction qui existe en C (dans io.h)
          • l'indentation est à revoir.

          -
          Edité par edgarjacobs hier à 2:14


          1- Qu'est-ce que ça change dans la pratique ? Parce que j'ai essayé les deux, et je ne vois aucune différence. Et j'ai beau chercher (dans la doc etc), je trouve pas grand chose à ce sujet

          2- je ferai attention à ce genre de choses la prochaine fois !

          3- Oui là c'est juste parce que ma touche tab est morte, donc j'ai du mal à me faire la main correctement pour écrire des choses propres. Mais je compte m'améliorer sur ce point-là aussi

          • Partager sur Facebook
          • Partager sur Twitter
            14 janvier 2019 à 22:14:05

            Re,-

            1- Dans la pratique, getchar() peut renvoyer EOF, et EOF vaut en général (int)-1, valeur qu'un char ne peut pas contenir. Même principe pour toupper().

            3- Petit truc en ce cas: appuyer sur la touche ALT et la maintenir enfoncée, taper ensuite 0 (zéro) et 9, puis relâcher la touche ALT: un tab est généré (ça marche même dans l'éditeur d'oc !)

            -
            Edité par edgarjacobs 14 janvier 2019 à 22:20:21

            • Partager sur Facebook
            • Partager sur Twitter

            On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

              25 janvier 2019 à 15:25:22

              Je vois, merci beaucoup ! Il est temps de mettre le sujet en résolu du coup !
              • Partager sur Facebook
              • Partager sur Twitter

              Problème avec le pendu en C

              × 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