Petit problème dans un de mes programmes.
Résolu
kenseii
Messages postés
23
Statut
Membre
-
fiddy Messages postés 11653 Statut Contributeur -
fiddy Messages postés 11653 Statut Contributeur -
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 :)
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:
- Petit problème dans un de mes programmes.
- Trier du plus petit au plus grand excel - Guide
- Petit 2 ✓ - Forum Windows
- Petit 3 ✓ - Forum Word
- Petit point vert snap ✓ - Forum Snapchat
- Comment imprimer une photo en petit ✓ - Forum Photo numérique
2 réponses
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 :
Cdlt,
Google is your friend
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
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
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,
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 :
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 ;-)).