Petit problème dans un de mes programmes.

Résolu
kenseii Messages postés 21 Date d'inscription   Statut Membre Dernière intervention   -  
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   -
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 :)
A voir également:

2 réponses

fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
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   Statut Membre Dernière intervention  
 
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 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846 > kenseii Messages postés 21 Date d'inscription   Statut Membre Dernière intervention  
 
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 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
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 523 Date d'inscription   Statut Membre Dernière intervention   125
 
Bonsoir,

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

Cordialement,
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
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