C getchar vs scanf
Je suis confus par un morceau de code dans une fonction, je suis étudiant:
char GetCommand( void )
{
char command;
do {
printf( "Enter command (q=quit, n=new, l=list): " );
scanf( "%c", &command );
Flush();
}
while ( (command != 'q') && (command != 'n')
&& (command != 'l') );
printf( "\n----------\n" );
return( command );
}
void Flush( void ) {
while ( getchar() != '\n' )
;
}
Ce que je ne comprends pas très bien ici est l'utilisation de la Flush()
fonction. Je veux dire, le livre que je lis explique en disant qu'il empêche l'utilisateur de la saisie de plus d'un seul caractère, et puis d'avoir le personnage à lire lorsqu'ils sont invités à fournir la 2ème fois.
Ce que je ne comprends pas, c'est comment Flush()
est empêcher que cela se produise. Il NE fait rien. Tout c'est un while
de commande. (Ce qui est vrai......quoi?????) Ne fait pas de sens.
source d'informationauteur startuprob
Vous devez vous connecter pour publier un commentaire.
getchar()
a aussi pour effet de supprimer le caractère suivant à partir de la mémoire tampon d'entrée. La boucle enFlush
lit et écarte les caractères jusqu'à et y compris le saut de ligne\n
la fin de la ligne.Depuis le
scanf
est dit de lire un et un seul caractère (%c
) ce qui a pour effet d'ignorer tout le reste sur la ligne de saisie.Il serait sans doute plus clair si le scanf a été remplacer par
mais il est en fait généralement mauvais exemple car il ne gère pas la Fin Du Fichier.
En général
scanf
est préférable d'oublier;fgets
etsscanf
travail beaucoup mieux que l'un est responsable de l'obtention de l'entrée et l'autre pour l'analyse.scanf
(etfscanf
) essayez de faire trop de choses à la fois.getchar
lit un caractère sur l'entrée standard. Si vous le mettez dans unwhile
de la boucle, il continue à lire les caractères un à un jusqu'à ce que la condition est fausse.Ce que le
Flush
fonction est fait, c'est la lecture jusqu'à ce qu'il rencontre un caractère de nouvelle ligne (\n
). C'est le caractère de produit lorsque l'utilisateur appuie sur la touche entrée.Donc, le code vous sera donné lecture d'un caractère (je suis pas clair sur pourquoi il utilise
scanf
pour cela, au lieu de simplementgetchar
ce qui serait plus rapide), puis efface le reste de l'entrée jusqu'à ce que l'utilisateur appuie sur entrée.Si vous étiez à nourrir ce programme
foobar
ce serait prendre lef
et jetez leoobar
dans leFlush
fonction. Sans remettreflush
lef
pourrait aller à unscanf
et la deuxièmescanf
serait d'obtenir la premièreo
.