Langage C Problème avec Boucle While et getchar();
Fermé
Yeah
-
15 nov. 2013 à 13:59
[Dal] Messages postés 6194 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 11 octobre 2024 - 15 nov. 2013 à 16:14
[Dal] Messages postés 6194 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 11 octobre 2024 - 15 nov. 2013 à 16:14
A voir également:
- While (getchar() != '\n');
- While fscanf ✓ - Forum C
- Scanf getchar ✓ - Forum C
- Factorielle python while ✓ - Forum Programmation
- While en assembleur ✓ - Forum Programmation
- Boucle while excel sans vba - Forum Excel
1 réponse
[Dal]
Messages postés
6194
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
11 octobre 2024
1 092
Modifié par [Dal] le 15/11/2013 à 15:10
Modifié par [Dal] le 15/11/2013 à 15:10
Salut Yeah,
Cela vient du fait qu'après avoir fait tes scanf, tu ne te préoccupes pas de vider le flux stdin, qui, au stade de ton getchar() dans la boucle contient au moins le retour chariot
Pour t'en convaincre, lorsque le programme demande "Veuillez Entrer le nom de Groupe", tape ceci :
Qu'arrive-t-il ? Le flux stdin contient
C'est plus qu'il n'en faut à ton programme, qui ne prend pas la peine de s'arrêter pour demander les autres entrées à l'utilisateur, il prend "toto" comme %s, puis 12.34 comme %f, puis 'N' pour ton getchar et se termine.
Donc, comme tu le vois, scanf et getch, qui sollicitent le flux stdin, se contentent de piocher dans le flux stdin les caractères qui y restent.
Pour purger stdin après chaque scanf, ajoute ceci :
avec c définit comme
C'est la façon habituelle de procéder en C pour purger stdin.
Dal
Cela vient du fait qu'après avoir fait tes scanf, tu ne te préoccupes pas de vider le flux stdin, qui, au stade de ton getchar() dans la boucle contient au moins le retour chariot
'\n'provenant du précédent scanf sinon plus.
Pour t'en convaincre, lorsque le programme demande "Veuillez Entrer le nom de Groupe", tape ceci :
toto 12.34Net valide (presse enter).
Qu'arrive-t-il ? Le flux stdin contient
toto 12.34N\n.
C'est plus qu'il n'en faut à ton programme, qui ne prend pas la peine de s'arrêter pour demander les autres entrées à l'utilisateur, il prend "toto" comme %s, puis 12.34 comme %f, puis 'N' pour ton getchar et se termine.
Donc, comme tu le vois, scanf et getch, qui sollicitent le flux stdin, se contentent de piocher dans le flux stdin les caractères qui y restent.
Pour purger stdin après chaque scanf, ajoute ceci :
while ((c = getchar()) != '\n' && c != EOF)
/* vidage de stdin */ ;
avec c définit comme
char c;.
C'est la façon habituelle de procéder en C pour purger stdin.
Dal
15 nov. 2013 à 15:12
Modifié par Yeah le 15/11/2013 à 15:35
void main()
{
char c[4];
float l;
printf("Entrez");
scanf("%s", &c);
printf("et float");
scanf("%f", &l);
printf("%s %f", c,l);
getch();
}
15 nov. 2013 à 15:52
Au premier scanf tape "toto 12a".
Ce ne sont pas les seuls problèmes dans ton code, car lorsque tu fais pour demander un "nom de groupe", ou comme dans ton dernier code ci-dessus, tu ne vérifies pas que l'entrée ne dépasse pas la capacité de mémoire réservée pour ou pour .
De plus, comme devrait être une chaîne (cependant on n'a pas le détail de ton type), c'est en tout cas le cas de , c'est en fait déjà un pointeur sur char. Par conséquent, tu ne devrais pas le préfixer de "&".
Dal
Modifié par [Dal] le 15/11/2013 à 16:05
getch n'est pas une fonction standard du C. Je suppose que tu es allé la chercher dans un conio.h (ou ailleurs ?).
Selon l'implémentation de cette fonction, le terminal va se comporter différemment, et pourra ne pas prendre en compte le flux stdin préexistant pour passer le terminal dans un mode où on attend la pression d'une touche sans écho à l'écran.
Ce n'est pas du C standard, donc c'est à éviter si tu veux faire du code portable.
Dal
15 nov. 2013 à 16:14
en tapant "toto 12abc" au premier scanf.
Chez moi (compilé avec MinGW) la lecture du flux stdin est juste suspendue au getch(), et reprend, non purgée après, le programme ne s'arrêtant pas aux getchar() qui sont à la suite.
Dal