Utiliser getchar () dans une boucle while

#include  main() { int c ; while ((c = getchar()) != EOF) { int isEOF = (c==EOF); printf("is %c EOF: %d ", c, isEOF); } } 

Pourquoi la méthode printf () est appelée deux fois sur chaque caractère en entrée ici?

Si je donne une entrée ‘a’, je reçois le résultat comme

 E:\C_workouts>gcc CharIO.c -o CharIO.exe E:\C_workouts>CharIO.exe a is a EOF: 0 is EOF: 0 

La même chose se produit à chaque entrée.

Parce que dans certaines implémentations de getchar (), lorsque vous appuyez sur la touche ‘x’ et sur Entrée, le tampon contient deux caractères (le ‘x’ et un caractère de nouvelle ligne). (Je sais, c’est un peu stupide) Vous devriez sauter les nouvelles lignes dans votre boucle.

Mise à jour: ceci a déjà été répondu ici: Où `getchar ()` stocke-t-il l’entrée utilisateur?

Parce que vous avez tapé ‘ aet\n ‘ …

Le ‘ \n ‘ résulte de la pression de la touche [ENTER] après avoir tapé dans la ligne de saisie de votre terminal / console. La getchar() renvoie chaque caractère, un à la fois, jusqu’à ce que le tampon d’entrée soit vide. Ainsi, votre boucle continuera à getchar() jusqu’à ce que getchar() ait mangé tous les caractères restants de la mémoire tampon du stream stdin .

Si vous vous attendez à ce que le tampon d’entrée stdin soit clair lors de l’appel de getchar() vous devez vider stdin avec while((ch=getchar())!='\n'&&ch!=EOF); pour consumr tout contenu précédent dans le tampon juste avant d’appeler getchar() . Certaines implémentations (beaucoup de compilateurs DOS / Windows) offrent un fflush(stdin); non standard fflush(stdin);

Cela devrait marcher …

     int c;
     while (((c = getchar ()) ^ EOF)) 
         printf ("is% c EOF:% d", c, c ^ EOF? 0: 1);