Confus à propos de la fonction getchar ()

Je suis confus quant au rôle de getchar() dans le code suivant. Je veux dire, je sais que cela m’aide à voir la fenêtre de sortie qui ne sera fermée que lorsque j’appuierai sur la touche Entrée .

Donc, getchar() attend essentiellement que je appuie sur Entrée, puis lit un seul caractère.

Quel est le caractère unique que cette fonction lit? Je n’ai appuyé sur aucune touche du clavier pour le lire.

Maintenant, quand il ne lit rien, pourquoi ne donne-t-il pas une erreur en disant “hé, vous n’avez rien entré à lire”?

 #include  int main() { printf( "blah \n" ); getchar(); return 0; } 

La getchar() attendra simplement jusqu’à ce qu’elle reçoive un caractère, en tenant le programme jusqu’à ce qu’il le fasse.

Un caractère est envoyé lorsque vous appuyez sur la touche Entrée; sous un système d’exploitation Windows, il envoie un retour chariot (CR) et un saut de ligne (LF).

Voir ce post CodingHorror pour une explication bien mise.

(… l’explication de la partie CR + LF, pas de la partie bloquante getchar() )

C’est parce que getchar () est une fonction de blocage .

Vous devriez en savoir plus sur les fonctions de blocage , ce qui oblige le processus à attendre quelque chose.

L’implémentation de ce comportement en attente dépend de la fonction, mais il s’agit généralement d’une boucle qui attend qu’un événement se produise.

Dans le cas de la getchar() , il s’agit probablement d’une boucle qui lit en permanence un fichier (stdin dans ce cas) et vérifie que le fichier est modifié. Si le fichier est modifié, la boucle se comporte différemment.

Essaye ça:

 #include  int main(int argc, char *argv[]) { char ch; printf("I'm now going to block until you press something and then return... "); ch = getchar(); if (ch >= 0) printf("\nYou pressed %c\n", ch); else printf("\nAliens have taken over standard input! Run!\n"); return 0; } 

getchar() fera en sorte que votre programme se mette en veille jusqu’à ce qu’une interruption clavier (ou ce qui est attaché à stdin) soit reçue. Cela signifie qu’il bloque, aucun code supplémentaire ne sera exécuté jusqu’à ce que getchar() revienne.

Il est très utile de regarder la valeur de retour d’une fonction pour la comprendre.

Toute fonction peut bloquer, à moins de fournir un mécanisme empêchant le blocage. Par exemple, open() autorise un drapeau O_NONBLOCK , ce qui est utile pour ouvrir les périphériques lents à répondre, tels que les modems. En bref, s’il reçoit une entrée d’un terminal ou doit attendre pour obtenir une réponse du kernel ou d’un périphérique quelconque, il ya de très bonnes chances pour qu’il se bloque.

getchar () bloque l’exécution de votre programme jusqu’à ce qu’une touche soit enfoncée. Donc, il n’y a pas d’erreur si aucune touche n’est enfoncée, getchar () attendra que cela se produise 🙂

Vous pouvez en apprendre plus sur le comportement de getchar ici: http://www.cppreference.com/wiki/c/io/getchar … ceci devrait répondre à votre question