Petit problème dans un de mes programmes.

Résolu/Fermé
kenseii Messages postés 21 Date d'inscription mardi 27 octobre 2009 Statut Membre Dernière intervention 31 juillet 2015 - 3 juin 2015 à 00:38
fiddy Messages postés 11067 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 3 juin 2015 à 23:19
Bonsoir tout le monde :)

Voilà, je vient tout juste de me lancer dans la programmation et du coup je commence par des petits exercice d'entraînements :)

voila je lance plusieurs commandes pour m'afficher par exemple un nombre entier, un flottant ou un caractère mais en fonction de l'ordre ça passe ou ça ne passe pas.
Je m'explique :

par exemple quand je compile :

#include <stdio.h>

int main()
{
int entier;
printf("Entrez un nombre entier :\n");
scanf("%d", &entier);
printf("vous avez choisi : %d\n", entier);

puts("");
float flottant;
printf("Entrez un flottant : \n");
scanf("%f", &flottant);
printf("Vous avez choisi : %.1f\n", flottant);

puts("");
int c;
printf("Entrez votre lettre : \n");
c = getchar();
printf("Vous avez choisi : %c\n", c);

return 0;
}

il me demande bien, l'entier, le flottant puis le programme se termine sans me demander la partie lettre.
Mais si je compile :

#include <stdio.h>

int main()
{
int c;
printf("Entrez votre lettre : \n");
c = getchar();
printf("Vous avez choisi : %c\n", c);

int entier;
printf("Entrez un nombre entier :\n");
scanf("%d", &entier);
printf("vous avez choisi : %d\n", entier);

puts("");
float flottant;
printf("Entrez un flottant : \n");
scanf("%f", &flottant);
printf("Vous avez choisi : %.1f\n", flottant);

return 0;
}

donc en commençant par la lettre, puis l'entier et le flottant tout se passe bien.

Quelqu'un aurait une explication svp ?

Merci :)

2 réponses

fiddy Messages postés 11067 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 812
Modifié par fiddy le 3/06/2015 à 10:52
Bonjour,

Lorsque tu utilises scanf("%d", ...);, il y a un retour chariot dans le buffer clavier (puisque tu dois appuyer sur entrée pour valider la saisie du nombre).
Si par la suite, tu utilises c=getchar(); c contiendra le code ascii du retour chariot sans même te demander la moindre saisie.
L'idée est de vider le buffer clavier. Dans ton cas, tu peux utiliser simplement :
getchar();
juste avant d'appeler c=getchar(); et tout rentrera dans l'ordre.

Cdlt,

Google is your friend
1
kenseii Messages postés 21 Date d'inscription mardi 27 octobre 2009 Statut Membre Dernière intervention 31 juillet 2015
3 juin 2015 à 18:52
Bonjour,

Merci, effectivement cela fonctionne.
qu'entends-tu par "buffer clavier" ?

j'ai essayé aussi de mettre: fflush(stdin); juste avant le c=getchar(); et ça marche tout autant :)

Merci
0
fiddy Messages postés 11067 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 812 > kenseii Messages postés 21 Date d'inscription mardi 27 octobre 2009 Statut Membre Dernière intervention 31 juillet 2015
3 juin 2015 à 22:51
buffer clavier
Il faut savoir qu'en C, lorsque tu utilises une fonction de lecture sur stdin (donc getchar(), scanf(...), etc.)., tu ne demandes pas directement à l'utilisateur de taper un nombre mais passe par un buffer (le buffer clavier).
S'il est vide, l'utilisateur sera invité à saisir son mot. Les caractères non lus seront stockés dans le buffer.
S'il est non vide, ce buffer valorisera la variable sans rien demander à l'utilisateur.
Cdlt,
0
fiddy Messages postés 11067 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 812
3 juin 2015 à 23:19
Ah oui, et j'ai oublié de répondre pour fflush(stdin).
La fonction fflush() provoque un comportement indéterminé sur stdin... Donc, à bannir. Cela peut fonctionner (j'imagine que tu utilises un compilateur microsoft ;-), pas vrai ?), mais ce n'est absolument pas portable. La manière standard de vider le buffer est de construire sa fonction :
int c;
while ((c=getchar()) != '\n' && c != EOF);

Mais dans ton cas, un simple getchar(); suffit (sauf si tu veux faire un programme robuste, mais dans ce cas, d'autres choses sont à revoir dans le code ;-)).
0
mouloud11 Messages postés 518 Date d'inscription mardi 22 septembre 2009 Statut Membre Dernière intervention 10 novembre 2019 125
3 juin 2015 à 01:47
Bonsoir,

Essaye de directement déclarer ta lettre en "char c".

Cordialement,
0
fiddy Messages postés 11067 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 812
3 juin 2015 à 10:54
Bonjour,

Cela ne règlera rien du tout puisqu'il est question ici de buffer clavier.
De plus, il vaut mieux laisser en int c;.

Cdlt,
0