getchar () et putchar ()

dans l’exemple:

#include  main() { long nc; nc = 0; while (getchar() != EOF) ++nc; printf("%ld\n", nc); } 

Je ne comprends pas bien. putchar () mettrait le caractère dehors, mais pourquoi après EOF, tous les caractères sont-ils sortis, et où se souvient-il de tous ces caractères? Merci.

C’est ce qu’on appelle la mise en mémoire tampon et c’est fait par le système d’exploitation. Habituellement, la mise en mémoire tampon des lignes consiste à enregistrer tous les caractères que vous avez mis en mémoire, puis à enregistrer le tout dans le fichier lorsqu’il rencontre un saut de ligne. Cela économise des ressources car les opérations sur les fichiers prennent beaucoup plus de temps que les autres opérations. Ainsi, au lieu de produire une sortie avec chaque caractère, il attend qu’un tas de caractères soit rassemblé dans la mémoire tampon et les écrit en une seule fois.

Il s’agit d’une manœuvre astucieuse de la part du système d’exploitation dont vous n’avez pas à vous soucier, le programmeur. Lancez vos personnages un par un et laissez le système d’exploitation gérer le rest à sa manière.

Non où, ce code ne vide que l’entrée et écrit combien de caractères sont restés avant la chasse.

Ceci est pour être sûr qu’il ne rest aucun caractère dans le fichier d’entrée (stdin)

Passons en revue votre code:

 #include  

Jusqu’ici tout va bien…

 main() { 
  1. La fonction main() retourne toujours un int . Toujours.
  2. Déclarer des fonctions sans type de retour est une forme médiocre, la valeur par défaut étant int , mais les gens ne s’en souviennent pas facilement lors de la lecture du code.

Passer à autre chose …

 long nc; nc = 0; 

Bonne forme. La variable est initialisée avant son utilisation.

 while (getchar() != EOF) ++nc; 

C’est un petit complexe. Mais un pas à la fois.

  1. La fonction getchar renvoie un int de l’entrée standard.
  2. Cette valeur est ensuite comparée à EOF .
  3. Si la valeur int de l’entrée standard n’est pas EOF , la variable nc est incrémentée.

Donc, pour sortir de la boucle while, un EOF doit être généré à partir de l’entrée standard.

Remarque: Aucune des valeurs lues à partir de l’entrée standard n’est enregistrée . Chaque valeur est ignorée après l’évaluation de l’expression.

Style : Je suggère d’utiliser ‘{‘ et ‘}’ après chaque instruction while . C’est une habitude sécuritaire à prendre.

 printf("%ld\n", nc); 

La déclaration ci-dessus est en train d’afficher (afficher) la valeur en nc . La valeur dans nc représente le nombre de caractères lus depuis l’entrée standard. Cette instruction n’affiche aucun caractère de l’entrée standard.

 } 

Enfin, le programme main doit renvoyer une valeur au système d’exploitation. Les deux valeurs portables sont EXIT_SUCCESS et EXIT_FAILURE , définies dans stdlib.h . Spécifier l’une de ces valeurs serait également une bonne habitude.

BTW, il n’y a pas de putchar dans l’exemple que vous avez posté (que j’ai copié dans cette réponse).

[ Ce n’est pas une réponse, mais vous ne pouvez pas mettre de code dans les commentaires ]

Je pense que vous vouliez dire quelque chose comme ça:

 #include  main() { long nc; nc = 0; char c; while ((c = getchar()) != EOF) { putchar(c); /* prints one char */ ++nc; } printf("%ld\n", nc); /* prints the number of characters read */ } 

putchar met le caractère dans la mémoire tampon quand il s’agit d’une entrée, puis il affichera le mot de sortie affiché à l’écran.