Langage C fonction scanf avec do while
Fermé
Fab_67
Messages postés
144
Date d'inscription
vendredi 24 juillet 2009
Statut
Membre
Dernière intervention
5 juin 2010
-
2 juin 2010 à 14:31
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 18 déc. 2012 à 23:02
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 18 déc. 2012 à 23:02
A voir également:
- While scanf c
- Scanf windows - Guide
- Scanf - Forum C
- Eol while scanning string literal ✓ - Forum Python
- Boucle while batch - Forum Programmation
- While fscanf ✓ - Forum C
6 réponses
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
5 juin 2010 à 20:59
5 juin 2010 à 20:59
Bonjour,
Lorsque tu tapes une lettre lors de ton scanf("%c",&i), elle n'est envoyée que lorsque tu appuies sur la touche entrée. Or la touche entrée correspond au caractère '\r' transformée en '\n' à la volée. Conséquence, tu n'envoies pas un caractère dans le buffer mais deux caractères (la touche pressée + '\n').
Ainsi lors de la première itération, ta variable "i" vaudra la touche voulue, et lors de la deuxième itération (sans même intervention de l'utilisateur puisqu'elle est déjà dans le buffer), "i" vaudra '\n'. Et à l'itération suivante, scanf redemandera à l'utilisateur de retaper un caractère (puisque le buffer est désormais vide).
D'où l'impression que ça ne marche qu'une fois sur deux.
Solution : vider le buffer à chaque itération. Par exemple, juste après le scanf, tu peux mettre ::
Note : je te conseille d'utiliser i=getchar(); plutôt que scanf("%c",&i);
Cdlt,
Lorsque tu tapes une lettre lors de ton scanf("%c",&i), elle n'est envoyée que lorsque tu appuies sur la touche entrée. Or la touche entrée correspond au caractère '\r' transformée en '\n' à la volée. Conséquence, tu n'envoies pas un caractère dans le buffer mais deux caractères (la touche pressée + '\n').
Ainsi lors de la première itération, ta variable "i" vaudra la touche voulue, et lors de la deuxième itération (sans même intervention de l'utilisateur puisqu'elle est déjà dans le buffer), "i" vaudra '\n'. Et à l'itération suivante, scanf redemandera à l'utilisateur de retaper un caractère (puisque le buffer est désormais vide).
D'où l'impression que ça ne marche qu'une fois sur deux.
Solution : vider le buffer à chaque itération. Par exemple, juste après le scanf, tu peux mettre ::
while (getchar()!='\n');
Note : je te conseille d'utiliser i=getchar(); plutôt que scanf("%c",&i);
Cdlt,
Fab_67
Messages postés
144
Date d'inscription
vendredi 24 juillet 2009
Statut
Membre
Dernière intervention
5 juin 2010
17
2 juin 2010 à 15:29
2 juin 2010 à 15:29
HELP ? =p
Fab_67
Messages postés
144
Date d'inscription
vendredi 24 juillet 2009
Statut
Membre
Dernière intervention
5 juin 2010
17
5 juin 2010 à 20:16
5 juin 2010 à 20:16
Help again ?
Emmanuel Delahaye
Messages postés
107
Date d'inscription
jeudi 18 juin 2009
Statut
Membre
Dernière intervention
17 juillet 2019
7
Modifié par Emmanuel Delahaye le 7/06/2010 à 16:47
Modifié par Emmanuel Delahaye le 7/06/2010 à 16:47
Déjà, il manque 2 ';' ...
Ensuite, il faut comprendre que tu entres 2 caractères (ex : "a\n") et que tu n'en lis qu'un avec scanf() et "%c". Évidemment, chaque saisie fait 2 tours ...
Pour remédier à ça, il faut lire le flux tant que le caractère lu n'est pas '\n'.
C is a sharp tool
Ensuite, il faut comprendre que tu entres 2 caractères (ex : "a\n") et que tu n'en lis qu'un avec scanf() et "%c". Évidemment, chaque saisie fait 2 tours ...
Pour remédier à ça, il faut lire le flux tant que le caractère lu n'est pas '\n'.
C is a sharp tool
#include <stdio.h> #include <stdlib.h> int main (void) { char i; /* -ed- manquait un ';' */ int j = 0; do { printf ("choisissez une lettre : "); scanf ("%c", &i); /* -ed- manquait un ';' */ /* -ed- lire ce qui n'a pas été lu ... */ if (i != '\n') { int c; while ((c = getchar ()) != '\n' && c != EOF) { } } printf ("'%c'\n", i); j = j + 1; } while (j < 6); system ("PAUSE"); return 0; }
voici une autre version plus lisible :
#include <stdio.h>
#include <stdlib.h>
int main (void)
{
char i; /* -ed- manquait un ';' */
int j = 0;
do
{
printf ("choisissez une nombre : ");
scanf ("%d",&i); /* -ed- manquait un ';' */
/* -ed- lire ce qui n'a pas été lu ... */
if (i != '\n')
{
int c;
while ((c = getchar ()) != '\n' && c != EOF )
{
}
}
printf ("\n%d",i);
j = j + 1;
if (j==3)
{
printf( "\nil vous reste aucun choix\n\n");
break;
}
printf(" \n\nil vous reste encore %d choix \n\n",3-j);
}
while (j < 4);
system ("PAUSE");
return 0;
}
#include <stdio.h>
#include <stdlib.h>
int main (void)
{
char i; /* -ed- manquait un ';' */
int j = 0;
do
{
printf ("choisissez une nombre : ");
scanf ("%d",&i); /* -ed- manquait un ';' */
/* -ed- lire ce qui n'a pas été lu ... */
if (i != '\n')
{
int c;
while ((c = getchar ()) != '\n' && c != EOF )
{
}
}
printf ("\n%d",i);
j = j + 1;
if (j==3)
{
printf( "\nil vous reste aucun choix\n\n");
break;
}
printf(" \n\nil vous reste encore %d choix \n\n",3-j);
}
while (j < 4);
system ("PAUSE");
return 0;
}
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
17 déc. 2012 à 23:48
17 déc. 2012 à 23:48
Tu remontes un topic de 2 ans...
Je ne trouve pas ton programme plus clair (peut-être est-ce l'effet de la non-indentation).
En plus, mettre un scanf("%d", ...) et tester après si c'est différent de '\n', c'est incompatible...
Et enfin c'est hors sujet (cf. énoncé : lire des caractères)
Je ne trouve pas ton programme plus clair (peut-être est-ce l'effet de la non-indentation).
En plus, mettre un scanf("%d", ...) et tester après si c'est différent de '\n', c'est incompatible...
Et enfin c'est hors sujet (cf. énoncé : lire des caractères)
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
#include <stdio.h>
#include <stdlib.h>
void main(void)
{
char i;
int j=0;
while(j < 6)
{
printf("choisissez une lettre: ");
scanf("%c",&i);
fflush(stdin);
printf("%c\n",i);
j=j+1;
}
system("PAUSE");
}
résolu
#include <stdlib.h>
void main(void)
{
char i;
int j=0;
while(j < 6)
{
printf("choisissez une lettre: ");
scanf("%c",&i);
fflush(stdin);
printf("%c\n",i);
j=j+1;
}
system("PAUSE");
}
résolu
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
18 déc. 2012 à 23:02
18 déc. 2012 à 23:02
main() renvoie un int...
fflush(stdin) n'est pas portable.
Bref, la bonne version a été donnée il y a deux ans...
fflush(stdin) n'est pas portable.
Bref, la bonne version a été donnée il y a deux ans...
evilfalcon
Messages postés
58
Date d'inscription
samedi 15 décembre 2012
Statut
Membre
Dernière intervention
10 novembre 2015
18 déc. 2012 à 22:49
18 déc. 2012 à 22:49
getchar() après ton scanf!
18 déc. 2012 à 21:47