Scanf et getchar qui fonctionne aléatoirement...?

Résolu/Fermé
kevdaig Messages postés 16 Date d'inscription dimanche 31 août 2014 Statut Membre Dernière intervention 22 février 2016 - 8 févr. 2015 à 03:02
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 9 févr. 2015 à 23:08
Bonjour, je ne sais pas si je fais quelque chose d'illégale mais voilà: j'ai des parties de fonctions qui s'execute aléatoirement...une fois sur 2 ou sur 3. Par exemple, si je ne rentre pas un entier valide, j'aurai 2 fois le message d'erreur sans me faire demander de faire une saisie au clavier...Donc dans le cas ci-dessous, le printf et le scanf fonctionne seulement 1 fois sur 2...

En voici un exemple:
int ValideEntierBornes(int Min, int Max, char* Msg)
{
	int EntierValide=FALSE;
	
	while(EntierValide==FALSE)
	{
		//Affichage du message passé en paramètre
		printf("%s", Msg);

		scanf("%d",&EntierValide);

		//Si l'entier reçu via scanf n'est pas entre les bornes
		if(Min>EntierValide||EntierValide>Max)
		{
			EntierValide=FALSE;
			printf("\nEntree I-N-V-A-L-I-D-E ! \n");
		}
	}
	return EntierValide;
}

Quelqu'un a une idée tordue?
A voir également:

1 réponse

fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 842
8 févr. 2015 à 19:36
Bonjour,

printf("%s", Msg);
Comment est défini Msg ?

Qu'entends-tu par "nombre invalide" ? Un nombre en dehors de la plage admise ? Ou une lettre par exemple ?

Sinon, là en l'état ce n'est pas bon. A aucun moment tu indiques EntierValide=TRUE; donc jamais tu ne pourras sortir de ta boucle.

Cdlt,
0
kevdaig Messages postés 16 Date d'inscription dimanche 31 août 2014 Statut Membre Dernière intervention 22 février 2016
9 févr. 2015 à 22:27
C'est vrai qu'il me manque un else qui rendrait EntierValide==TRUE. Je l'ai rajouté mais le problème n'est pas là...Autant scanf que getchar voit quelque chose sans qu,il n'y ait eu de saisit au clavier...

Quand je fais le debug pas à pas, dans mon mon scanf me retourne le code ASCII "2" et si j'utilise un getchar à la place, cela me retourne le code ASCII "10"...mais je n'ai rien tapé au clavier c'est dingue!

Pour ton info, Msg n'est qu'une chaine de caractère qui arrive de cette fonction:

char* MsgDemande(int NumDemande)
{
	switch(NumDemande)
	{
		case DEMANDE_NIVEAU:
			return "Quel niveau desirez-vous jouer?\n\n 1-Tres facile     ( 5%)\n 2-Facile          (10%)\n 3-Moyen           (15%)\n 4-Difficile       (20%)\n 5-Tres difficile  (25%)\n\n(Ou (Q)uitter la partie)\n\n Commande: ";
		break;

		case DEMANDE_X:
			return "\nQuelle sera la dimension en X (10-75)?\n(Ou (Q)uitter la partie)\n\n Commande: ";
		break;

		case DEMANDE_Y:
			return	"\nQuelle sera la dimension en Y (10-18)?\n(Ou (Q)uitter la partie)\n\n Commande: ";
		break;

		case DEMANDE_ACTION:
			return "(Q)uitter/(M)ine/(E)xplorer\n\n Commande: ";
		break;

		case DEM_COUP_X:
			return " dans quelle colonne se trouve cette case?\n Commande: ";
		break;

		case DEM_COUP_Y:
			return "\ dans quelle ligne se trouve cette case?\n Commande: ";
		break;
 
		default:
			return "\nProbleme avec le message a afficher... \n\n";
		break;
	}
}
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 842
9 févr. 2015 à 23:08
Dommage qu'on revoit pas ton code corrigé.
En tout cas le else est vraiment important.
De plus, autre erreur :
EntierValide==FALSE
Tu mets FALSE dans EntierValide et c'est EntierValide que tu retournes...
Il faut dissocier ces variables : 1 pour la boucle, l'autre pour la variable. Ou alors si tu n'en veux qu'une, il faut mettre la condition aussi dans la boucle while...

Après, pour le getchar() c'est normal qu'il retourne un 10. Mais j'en ai pas parlé vu que ça ne faisait pas partie de ton post initial. Il faut savoir qu'au moment du scanf("%d",&EntierValide); tu appuies sur la touche entrée ('\n') pour valider le nombre saisi. Ainsi il y a '\n' (qui vaut 10) qui traine dans le buffer clavier. Si tu fais un getchar(), ce dernier va récupérer le 10.

Cdlt,
0