Correction programme - Problème de TYPE

Résolu/Fermé
Gouag Messages postés 32 Date d'inscription vendredi 22 novembre 2013 Statut Membre Dernière intervention 28 mars 2014 - Modifié par Gouag le 27/02/2014 à 21:27
Gouag Messages postés 32 Date d'inscription vendredi 22 novembre 2013 Statut Membre Dernière intervention 28 mars 2014 - 28 févr. 2014 à 17:33
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

fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
27 févr. 2014 à 21:53
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,
0
Gouag Messages postés 32 Date d'inscription vendredi 22 novembre 2013 Statut Membre Dernière intervention 28 mars 2014
28 févr. 2014 à 06:07
Merci beaucoup.
Cdlt
0
Gouag Messages postés 32 Date d'inscription vendredi 22 novembre 2013 Statut Membre Dernière intervention 28 mars 2014
28 févr. 2014 à 17:33
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");
    }


}
0