Correction programme - Problème de TYPE

Résolu
Bonjour,

J'ai écrit le programme suivant.
Il fonctionne.

Cependant lorsque je modifie mes
SCANF%s
en
SCANF%c
cela ne fonctionne plus et je ne comprends pas pourquoi. Cette fonction s'applique pour la saisie de la variable
réponse
.

De même lorsque je change le type de la variable
reponse
pour la passer de
char
en
int
, avec une saisie du chiffre 1 pour dire oui et le chiffre 0 pour dire non, il fonctionne également.

Quelqu'un pourrait il m'expliquer pourquoi le type de donnée
char
pour la variable reponse avec %c ne fonctionne pas dans ce programme car ce type fonctionne bien avec %s?

Merci d'avance
Bien cordialement

PS: J'ai saisis les 3 programmes: 2 fonctionnant + 1 ne fonctionnant pas

PROGRAMME FONCTIONNANT:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>


int main(int argc, char *argv[])
{

int nombresaisi,nombreMystere,compteur=1,MAX,MIN,niveau;
char reponse,o;

printf("Voulez vous jouer avec nous (saisir o ou n)?\n");
scanf("%s",&reponse);

if(reponse=='o')
{
   do
    {
        compteur=1;
        niveau==0;
        printf("Choisir le niveau:\n");
        scanf("%d",&niveau);



        if (niveau==1)
        {
                    MIN=1;
                    MAX=100;
                    srand(time(NULL));
                    nombreMystere = (rand() % (MAX - MIN + 1)) + MIN;



                         do
                         {
                            reponse==0;
                            printf("Saisir un nombre entier positif ou nul:");
                            scanf ("%d",&nombresaisi);
                            if(nombresaisi<nombreMystere)
                            {
                            printf("C'est plus\n\n");
                            compteur++;
                            }
                            else if (nombresaisi>nombreMystere)
                            {
                            printf("C'est moins\n\n");
                            compteur++;
                            }
                            else
                           {
                           printf("Bravo vous avez trouve le nombre mystere\n\n\a");
                           printf("Le nombre de tentative est de:%d\n\n",compteur++);
                           }
                         }
                         while (nombresaisi!=nombreMystere);
        printf("voulez vous rejouer?");
        scanf("%s",&reponse);
        }

        else if (niveau==2)
        {

                    MIN=1;
                    MAX=1000;
                    srand(time(NULL));
                    nombreMystere = (rand() % (MAX - MIN + 1)) + MIN;



                         do
                         {
                            reponse==0;
                            printf("Saisir un nombre entier positif ou nul:");
                            scanf ("%d",&nombresaisi);
                            if(nombresaisi<nombreMystere)
                            {
                            printf("C'est plus\n\n");
                            compteur++;
                            }
                            else if (nombresaisi>nombreMystere)
                            {
                            printf("C'est moins\n\n");
                            compteur++;
                            }
                            else
                           {
                           printf("Bravo vous avez trouve le nombre mystere\n\n");
                           printf("Le nombre de tentative est de:%d\n\n",compteur++);
                           }
                         }
                         while (nombresaisi!=nombreMystere);
        printf("voulez vous rejouer?\n");
        scanf("%s",&reponse);
         }

         else if (niveau==3)
         {
                    MIN=1;
                    MAX=10000;
                    srand(time(NULL));
                    nombreMystere = (rand() % (MAX - MIN + 1)) + MIN;



                         do
                         {
                            reponse==0;
                            printf("Saisir un nombre entier positif ou nul:");
                            scanf ("%d",&nombresaisi);
                            if(nombresaisi<nombreMystere)
                            {
                            printf("C'est plus\n\n");
                            compteur++;
                            }
                            else if (nombresaisi>nombreMystere)
                            {
                            printf("C'est moins\n\n");
                            compteur++;
                            }
                            else
                           {
                           printf("Bravo vous avez trouve le nombre mystere\n\n");
                           printf("Le nombre de tentative est de:%d\n\n",compteur++);
                           }
                         }
                         while (nombresaisi!=nombreMystere);
          printf("voulez vous rejouer?\n");
          scanf("%s",&reponse);
          }


   }
while(reponse=='o');
    {
    printf("Tant pis!Une autre fois peut etre!\n\n");
    }
}

else
    {
    printf("Tant pis!Une autre fois peut etre!\n");
    }


}


PROGRAMME NE FONCTIONNANT PAS:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>


int main(int argc, char *argv[])
{

int nombresaisi,nombreMystere,compteur=1,MAX,MIN,niveau;
char reponse,o;

printf("Voulez vous jouer avec nous (saisir o ou n)?\n");
scanf("%c",&reponse);

if(reponse=='o')
{
   do
    {
        compteur=1;
        niveau==0;
        printf("Choisir le niveau:\n");
        scanf("%d",&niveau);



        if (niveau==1)
        {
                    MIN=1;
                    MAX=100;
                    srand(time(NULL));
                    nombreMystere = (rand() % (MAX - MIN + 1)) + MIN;



                         do
                         {
                            reponse==0;
                            printf("Saisir un nombre entier positif ou nul:");
                            scanf ("%d",&nombresaisi);
                            if(nombresaisi<nombreMystere)
                            {
                            printf("C'est plus\n\n");
                            compteur++;
                            }
                            else if (nombresaisi>nombreMystere)
                            {
                            printf("C'est moins\n\n");
                            compteur++;
                            }
                            else
                           {
                           printf("Bravo vous avez trouve le nombre mystere\n\n\a");
                           printf("Le nombre de tentative est de:%d\n\n",compteur++);
                           }
                         }
                         while (nombresaisi!=nombreMystere);
        printf("voulez vous rejouer?");
        scanf("%c",&reponse);
        }

        else if (niveau==2)
        {

                    MIN=1;
                    MAX=1000;
                    srand(time(NULL));
                    nombreMystere = (rand() % (MAX - MIN + 1)) + MIN;



                         do
                         {
                            reponse==0;
                            printf("Saisir un nombre entier positif ou nul:");
                            scanf ("%d",&nombresaisi);
                            if(nombresaisi<nombreMystere)
                            {
                            printf("C'est plus\n\n");
                            compteur++;
                            }
                            else if (nombresaisi>nombreMystere)
                            {
                            printf("C'est moins\n\n");
                            compteur++;
                            }
                            else
                           {
                           printf("Bravo vous avez trouve le nombre mystere\n\n");
                           printf("Le nombre de tentative est de:%d\n\n",compteur++);
                           }
                         }
                         while (nombresaisi!=nombreMystere);
        printf("voulez vous rejouer?\n");
        scanf("%c",&reponse);
         }

         else if (niveau==3)
         {
                    MIN=1;
                    MAX=10000;
                    srand(time(NULL));
                    nombreMystere = (rand() % (MAX - MIN + 1)) + MIN;



                         do
                         {
                            reponse==0;
                            printf("Saisir un nombre entier positif ou nul:");
                            scanf ("%d",&nombresaisi);
                            if(nombresaisi<nombreMystere)
                            {
                            printf("C'est plus\n\n");
                            compteur++;
                            }
                            else if (nombresaisi>nombreMystere)
                            {
                            printf("C'est moins\n\n");
                            compteur++;
                            }
                            else
                           {
                           printf("Bravo vous avez trouve le nombre mystere\n\n");
                           printf("Le nombre de tentative est de:%d\n\n",compteur++);
                           }
                         }
                         while (nombresaisi!=nombreMystere);
          printf("voulez vous rejouer?\n");
          scanf("%c",&reponse);
          }


   }
while(reponse=='o');
    {
    printf("Tant pis!Une autre fois peut etre!\n\n");
    }
}

else
    {
    printf("Tant pis!Une autre fois peut etre!\n");
    }


}


PROGRAMME FONCTIONNANT:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>


int main(int argc, char *argv[])
{

int nombresaisi,nombreMystere,compteur=1,reponse,MAX,MIN,niveau;


printf("Voulez vous jouer avec nous (saisir 1 ou 0)?\n");
scanf("%d",&reponse);

if(reponse==1)
{
   do
    {
        compteur=1;
        niveau==0;
        printf("Choisir le niveau:\n");
        scanf("%d",&niveau);



        if (niveau==2)
        {
                    MIN=1;
                    MAX=100;
                    srand(time(NULL));
                    nombreMystere = (rand() % (MAX - MIN + 1)) + MIN;



                         do
                         {
                            reponse==0;
                            printf("Saisir un nombre entier positif ou nul:");
                            scanf ("%d",&nombresaisi);
                            if(nombresaisi<nombreMystere)
                            {
                            printf("C'est plus\n\n");
                            compteur++;
                            }
                            else if (nombresaisi>nombreMystere)
                            {
                            printf("C'est moins\n\n");
                            compteur++;
                            }
                            else
                           {
                           printf("Bravo vous avez trouve le nombre mystere\n\n\a");
                           printf("Le nombre de tentative est de:%d\n\n",compteur++);
                           }
                         }
                         while (nombresaisi!=nombreMystere);
        printf("voulez vous rejouer?");
        scanf("%d",&reponse);
        }

        else if (niveau==3)
        {

                    MIN=1;
                    MAX=1000;
                    srand(time(NULL));
                    nombreMystere = (rand() % (MAX - MIN + 1)) + MIN;



                         do
                         {
                            reponse==0;
                            printf("Saisir un nombre entier positif ou nul:");
                            scanf ("%d",&nombresaisi);
                            if(nombresaisi<nombreMystere)
                            {
                            printf("C'est plus\n\n");
                            compteur++;
                            }
                            else if (nombresaisi>nombreMystere)
                            {
                            printf("C'est moins\n\n");
                            compteur++;
                            }
                            else
                           {
                           printf("Bravo vous avez trouve le nombre mystere\n\n");
                           printf("Le nombre de tentative est de:%d\n\n",compteur++);
                           }
                         }
                         while (nombresaisi!=nombreMystere);
        printf("voulez vous rejouer?\n");
        scanf("%d",&reponse);
         }

         else if (niveau==4)
         {
                    MIN=1;
                    MAX=10000;
                    srand(time(NULL));
                    nombreMystere = (rand() % (MAX - MIN + 1)) + MIN;



                         do
                         {
                            reponse==0;
                            printf("Saisir un nombre entier positif ou nul:");
                            scanf ("%d",&nombresaisi);
                            if(nombresaisi<nombreMystere)
                            {
                            printf("C'est plus\n\n");
                            compteur++;
                            }
                            else if (nombresaisi>nombreMystere)
                            {
                            printf("C'est moins\n\n");
                            compteur++;
                            }
                            else
                           {
                           printf("Bravo vous avez trouve le nombre mystere\n\n");
                           printf("Le nombre de tentative est de:%d\n\n",compteur++);
                           }
                         }
                         while (nombresaisi!=nombreMystere);
          printf("voulez vous rejouer?\n");
          scanf("%d",&reponse);
          }


   }
while(reponse==1);
    {
    printf("Tant pis!Une autre fois peut etre!\n\n");
    }
}

else
    {
    printf("Tant pis!Une autre fois peut etre!\n");
    }


}

3 réponses

  1. Contributeur
    Bonjour,

    J'ai juste regardé la partie scanf().
    Seul le dernier programme est correct.
    Le premier fonctionne peut-être mais est faux. Le deuxième est presque correcte en revanche.

    Explication :

    char reponse;
    scanf("%s",&reponse);

    %s est à utiliser avec un pointeur sur une zone mémoire. Donc reponse doit être de type char *reponse=malloc(...); ou char reponse[2];
    Sinon, tu vas récrire une partie de la pile et cela peut provoquer des erreurs inattendues. Dans ce cas, il faudra mettre : scanf("%s",reponse); (et non &reponse;).

    char reponse;
    scanf("%c",&reponse);

    Ici c'est bon. Mais, il y aura un '\n' qui sera stocké dans le buffer clavier lorsque tu appuieras sur la touche entrée pour valider la saisie. De fait, la valeur retournée lors du scanf("%c",...) suivant sera le même '\n'. D'où le problème. Il suffit de glisser un petit getchar(); juste après chaque scanf("%c",&reponse);

    Le dernier (scanf("%d",...)) est une saisie par nombre. C'est plus simple à gérer lorsqu'on n'est pas à l'aise avec les notions abordées ci-dessus.

    Cdlt,
    1. Re,

      J'ai suivi les instructions données ici:

      char reponse;
      scanf("%c",&reponse);
      Ici c'est bon. Mais, il y aura un '\n' qui sera stocké dans le buffer clavier lorsque tu appuieras sur la touche entrée pour valider la saisie. De fait, la valeur retournée lors du scanf("%c",...) suivant sera le même '\n'. D'où le problème. Il suffit de glisser un petit getchar(); juste après chaque scanf("%c",&reponse);


      mais ça ne fonctionne toujours pas !?

      #include <stdio.h>
      #include <stdlib.h>
      #include <time.h>
      
      
      int main(int argc, char *argv[])
      {
      
      int nombresaisi,nombreMystere,compteur=1,MAX,MIN,niveau;
      char reponse,o;
      
      printf("Voulez vous jouer avec nous (saisir o ou n)?\n");
      scanf("%c",&reponse);
      getchar();
      if(reponse=='o')
      {
         do
          {
              compteur=1;
              niveau==0;
              printf("Choisir le niveau:\n");
              scanf("%d",&niveau);
      
      
      
              if (niveau==1)
              {
                          MIN=1;
                          MAX=100;
                          srand(time(NULL));
                          nombreMystere = (rand() % (MAX - MIN + 1)) + MIN;
      
      
      
                               do
                               {
                                  reponse==0;
                                  printf("Saisir un nombre entier positif ou nul:");
                                  scanf ("%d",&nombresaisi);
                                  if(nombresaisi<nombreMystere)
                                  {
                                  printf("C'est plus\n\n");
                                  compteur++;
                                  }
                                  else if (nombresaisi>nombreMystere)
                                  {
                                  printf("C'est moins\n\n");
                                  compteur++;
                                  }
                                  else
                                 {
                                 printf("Bravo vous avez trouve le nombre mystere\n\n\a");
                                 printf("Le nombre de tentative est de:%d\n\n",compteur++);
                                 }
                               }
                               while (nombresaisi!=nombreMystere);
              printf("voulez vous rejouer?");
              scanf("%c",&reponse);
              getchar();
              }
      
              else if (niveau==2)
              {
      
                          MIN=1;
                          MAX=1000;
                          srand(time(NULL));
                          nombreMystere = (rand() % (MAX - MIN + 1)) + MIN;
      
      
      
                               do
                               {
                                  reponse==0;
                                  printf("Saisir un nombre entier positif ou nul:");
                                  scanf ("%d",&nombresaisi);
                                  if(nombresaisi<nombreMystere)
                                  {
                                  printf("C'est plus\n\n");
                                  compteur++;
                                  }
                                  else if (nombresaisi>nombreMystere)
                                  {
                                  printf("C'est moins\n\n");
                                  compteur++;
                                  }
                                  else
                                 {
                                 printf("Bravo vous avez trouve le nombre mystere\n\n");
                                 printf("Le nombre de tentative est de:%d\n\n",compteur++);
                                 }
                               }
                               while (nombresaisi!=nombreMystere);
              printf("voulez vous rejouer?\n");
              scanf("%c",&reponse);
              getchar();
               }
      
               else if (niveau==3)
               {
                          MIN=1;
                          MAX=10000;
                          srand(time(NULL));
                          nombreMystere = (rand() % (MAX - MIN + 1)) + MIN;
      
      
      
                               do
                               {
                                  reponse==0;
                                  printf("Saisir un nombre entier positif ou nul:");
                                  scanf ("%d",&nombresaisi);
                                  if(nombresaisi<nombreMystere)
                                  {
                                  printf("C'est plus\n\n");
                                  compteur++;
                                  }
                                  else if (nombresaisi>nombreMystere)
                                  {
                                  printf("C'est moins\n\n");
                                  compteur++;
                                  }
                                  else
                                 {
                                 printf("Bravo vous avez trouve le nombre mystere\n\n");
                                 printf("Le nombre de tentative est de:%d\n\n",compteur++);
                                 }
                               }
                               while (nombresaisi!=nombreMystere);
                printf("voulez vous rejouer?\n");
                scanf("%c",&reponse);
                getchar();
                }
      
      
         }
      while(reponse=='o');
          {
          printf("Tant pis!Une autre fois peut etre!\n\n");
          }
      }
      
      else
          {
          printf("Tant pis!Une autre fois peut etre!\n");
          }
      
      
      }