while (getchar ()! = ‘\ n’);

J’ai le suivant pour la boucle, je demande à l’utilisateur d’entrer une NIP à 4 chiffres et d’appuyer sur Entrée. Quelqu’un peut-il m’expliquer ce que la boucle while fait vraiment parce que je ne la comprends pas bien?

//user input for pin for(i = 0; i < PIN_LENGTH; i++) { printf("Enter digit %d of your PIN: ", i); user_pin[i] = getchar(); while (getchar() != '\n'); //what is this line doing?? } 

Lorsque vous saisissez le programme, vous le terminez avec la touche Entrée . Cette clé est envoyée à votre programme en tant que nouvelle ligne.

Ce que la boucle fait, c’est lire et ignorer les caractères jusqu’à ce qu’il ait lu la nouvelle ligne. Il vide le tampon d’entrée.

Si vous ne le faites pas, le prochain appel principal à getchar renverra la nouvelle ligne au lieu du chiffre attendu.

Comme mentionné par d’autres, cette boucle supprime les caractères non stdin de stdin afin que la fonction d’entrée suivante ait un stream vierge et notamment le \n qui suit le dernier caractère saisi par l’utilisateur. Cependant, getchar() renvoie EOF en cas d’erreur de lecture. La boucle doit donc également tester EOF , comme ceci:

 int ch; while ((ch = getchar()) != '\n' && ch != EOF) continue; // discard unwanted characters 

Notez également que, si stdin a été redirigé, il est possible d’atteindre EOF sans rencontrer un \n . Et, comme @chqrlie l’a souligné dans les commentaires, l’utilisateur peut signaler un EOF depuis le terminal en entrant Ctrl-D sous Linux ou Ctrl-Z sous Windows. D’où l’importance de tester explicitement EOF .

La ligne suivante ignore les éventuels caractères supplémentaires que l’utilisateur peut avoir entrés, ainsi que le caractère de saut de ligne que l’utilisateur a dû entrer.

Ainsi, d’autres méthodes scanf/getchar plus loin dans le code ne sont pas polluées par cette entrée parasite.

La boucle while est utilisée pour vérifier quand l’utilisateur appuiera sur enter. L’entrée est considérée comme ‘\ n’.

Cette ligne dure un certain temps, elle sera donc répétée au moment de l’exécution jusqu’à getchar () == ‘\ n’. ‘\ n’ est un caractère qui, en ASCII, signifie “entrer”. De cette façon, vous pouvez vérifier que l’utilisateur n’appuiera pas sur “entrée” sans avoir inséré un numéro.