Problème d'affichage avec fonction switch

Résolu/Fermé
Onyx67 Messages postés 132 Date d'inscription mercredi 24 février 2010 Statut Membre Dernière intervention 18 août 2016 - Modifié par Onyx67 le 27/06/2014 à 12:02
[Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 - 27 juin 2014 à 15:03
Bonjour,

en utilisant la fonction switch pour un petit programme personnel (no comment sur les contenus des printf hein ;) ) , je n'arrive pas à afficher dans le bon ordre les messages :
les premiers messages s'affichent au bon moment, mais dès que le premier scanf arrive, je ne sais pas pourquoi, mais au lieu d'afficher le résultat du scanf comme indiqué dans le programme, il attend que j'ai tapé tous les scanf nécessaires pour enfin afficher tous les messages qui manquaient à la fin!
J'ai essayé de déplacer les printf dans le code, et j'ai l'impression que quelle que soit leur place, la priorité est donnée aux scanf!

Voici mon code :

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

int Jokes(); // fonction du choix 1
int Unicorns(); // fonction du choix 2
int Sarcastic() ; // fonction du choix 3

int menu()
{
int choix = 0;
printf("Hello Mrs the President, welcome to Sarcastic Unicorns S.A. \n");
printf("What do you want to do today?\n");
printf("1. Make a stupid joke\n");
printf("2. Hug a unicorn\n");
printf("3. Be sarcastic\n");
printf("Type your choice\n");
scanf("%d ", &choix);

if (choix <1 || choix >3)
{
printf("Don't mess with me darling\n");
}
return choix;
}

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

switch(menu())
{
case 1 :
printf("You, Valentine and Aurore laugh so hard that everyone is wondering if you're on drugs or not\n");
Jokes();//appel de la fonction Jokes
break ;

case 2 :
printf("You are hugging a unicorn. Beware : it makes you horny :p\n "); // titre du menu et message marrant
Unicorns(); // appel de la fonction Unicorns
break ;

case 3 :
printf("No one else except me understands your sense of humour\n"); // titre du menu et message marrant
Sarcastic();//appel de la fonction Sarcastic
break ;

}

return 0;
}

int Jokes() // fonction appelée lorsqu'on a tapé 1
{
int choix = 0;
printf("1. Ignore the others \n"); // choix proposés : le titre du menu est déjà affiché
printf("2. Blame Aurore\n");
printf("3. Get back to sleep\n");
scanf("%d", &choix);

if (choix <1 || choix >3)
{
printf("Don't mess with me darling\n");
}

switch(choix)
{
case 1 :
printf("\n");
break;
case 2 :
printf("\n");
break;
case 3:
printf("\n");
break;

}


}

int Unicorns() //fonction lorsqu'on a tapé 2
{
int choix = 0;
printf(""); // choix proposés : le titre du menu est déjà affiché
printf("");
printf("");
scanf("%d", &choix);

if (choix <1 || choix >3)
{
printf("Don't mess with me darling\n");
}

switch(choix)
{
case 1 :
printf("1. Continue : it feels so good\n");
break;
case 2 :
printf("2. My unicorn is farting rainbows \n");
break;
case 3:
printf("3. Please don't leave me alone with this unicorn!\n ");
break;

}
}

int Sarcastic() // fonction lorsqu'on a tapé 3
{
int choix = 0;

printf("\n"); // choix proposés : le titre du menu est déjà affiché
printf("\n");
printf("\n");
scanf("%d", &choix);

if (choix <1 || choix >3)
{
printf("Don't mess with me darling\n");
}

switch(choix)
{
case 1 :
printf("Everyone is trying to guess what you're implying\n");
break;
case 2 :
printf("\n");
break;
case 3:
printf("\n");
break;

}

}

Et encore quelques printf vides pour l'instant mais ça m'étonnerait que ce soit le problème!
A voir également:

2 réponses

[Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 1 096
27 juin 2014 à 13:34
Salut Onyx67,

Sur le scanf de ta fonction menu(), tu as ajouté un espace après le spécificateur %d :
scanf("%d ", &choix); 
, retire cet espace, et essaye.


Dal
0
Onyx67 Messages postés 132 Date d'inscription mercredi 24 février 2010 Statut Membre Dernière intervention 18 août 2016 1
27 juin 2014 à 14:27
Merci beaucoup!! ça marche effectivement!
Je ne pensais pas que les espaces avaient de l'importance en C pourtant!
0
[Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 1 096
Modifié par [Dal] le 27/06/2014 à 15:04
Voilà ma compréhension :

un espace dans le spécificateur de scanf signifie : lire et ignorer un ou plusieurs espaces blancs consécutifs jusqu'au prochain espace non "blanc". Or, pour scanf, les espaces blancs sont : le caractère espace, tabulation et '\n' (retour à la ligne).

http://www.cplusplus.com/reference/cstdio/scanf/

Donc, en mettant un espace à la fin de ton spécificateur, tu dis à scanf de lire et d'ignorer les espaces blancs à la suite du décimal capturé jusqu'au prochain caractère non-blanc, ce qui a pour effet de lire et d'ignorer le retour à la ligne et de réclamer au moins un autre caractère non blanc à saisir.


Dal
0