Comment faire pour effacer l'entrée standard stdin avant d'obtenir une nouvelle?
J'ai lu environ 5-10 différents conseils comment faire pour effacer l'entrée standard stdin, mais aucun d'entre eux est adapté à mes besoins. Le truc, c'est que fflush(stdin)
a parfaitement fonctionné sur mon ordinateur, mais malheureusement, il ne semble pas fonctionner partout, donc j'ai besoin de quelque chose avec les mêmes fonctionnalités. Tous les autres, j'ai essayé efface stdin quand il n'est pas vide, mais nécessite la saisie de l'utilisateur lors de l'entrée standard stdin EST vide, ce qui signifie qu'il exige que l'entrée dans un moment, je ne veux pas obtenir tout (+ il ignore de toute façon).
La question est: puis-je faire en quelque sorte en sorte, que stdin
EST vide avant que je nécessitent la saisie de l'utilisateur? (et si non, alors, et seulement ALORS clair c'est en quelque sorte?)
quelque chose comme:
if (stdin is NOT empty)
while (getchar() != '\n')
continue;
EDIT: le truc c'est que je charge les caractères de stdin
un par un, et à un certain point, une partie de l'entrée de la précédente itération pourrait ou ne pourrait pas se jeter. de toute façon, j'ai besoin d'avoir clairement stdin
avant de me demander à l'utilisateur une autre entrée pour être traité. De compensation de la mémoire tampon n'est pas une grosse affaire, le problème est ce qui se passe lorsque l'entrée est vide lorsque le programme arrive au point de compensation stdin
, parce qu'en ce moment le programme a besoin d'une autre entrée qui va être mangé par la fonction de compensation. C'est ce que je voulez vous débarrasser de. (quand je pourrais utiliser fflush(stdin);
je savais, que la prochaine ligne de mon programme de la stdin
SERA vide de n'importe quoi, sans poser de questions...)
fflush(stdin)
UB.Il n'y a pas une telle chose comme un vider le flux d'e/S , est un stream. Considérer:
./myprog </dev/random
; il jamais voir la fin de ses flux stdin?programmation sur windows, est de travailler à linux...
Que la nature de l'application serait de vouloir faire cela? En 30 ans de la programmation en C, je n'ai jamais ressenti le besoin, et je ne connais absolument pas le programme de cette. Mais tous les débutants le souhaitez. pourquoi, OH POURQUOI? qu'est-Ce que l'anti-modèle? Qu'est-ce que le XY-problème que vous essayez de résoudre?
Voulez-vous éliminer toute partiellement tapé les lignes d'entrée (qui est, d'entrée pour lequel l'utilisateur n'a pas tapé ENTRÉE pour valider)?
OriginalL'auteur Tom | 2016-04-19
Vous devez vous connecter pour publier un commentaire.
Avec C portable ce n'est pas possible.
Au lieu de suggérer à un autre (et plus d'habitude C) de paradigme:
Assurer précédentes fonctions d'entrée consomme tous l'entrée précédente.
fgets()
(ou de *nixgetline()
) est typique de l'approche et de résoudre la plupart des situations.Ou rouler vos propres. La suite se lit une ligne entière, mais n'enregistre pas d'alimentation supplémentaires.
OriginalL'auteur chux
TL;DR
fflush(stdin)
appelle un comportement indéfini, conformément à la norme, vous devriez ne jamais les utiliser.Venir à votre code (logique), au lieu de chercher une nouvelle ligne, vous pouvez regarder pour
EOF
. Il n'est pas nécessaire questdin
devrait avoir certains d'entrée avant l'exécution de cette boucle.Quelque chose comme
devrait répondre à vos besoins.
Au moins à windows, vous avez besoin pour générer explicitement EOF pour stdio avec Ctrl+Z.
Re, pas de. Votre boucle attend jusqu'à ce que l'utilisateur génère un EOF (
^D
ou^Z
), alors que l'OP a demandé un moyen de vider le tampon d'entrée.OriginalL'auteur Sourav Ghosh
Utilisation seulement
fgets()
à lirestdin
.Utiliser un tampon assez grand et/ou de test pour les lignes pleines.
À l'aide de
fgets()
vous n'aurez jamais à vous soucier de caractères supplémentaires dansstdin
.if (tmp[strlen(tmp) - 1] != '\n')
UB sitmp[0] == 0
. Assez facile d'avoir le premier caractère lu parfgets()
être le caractère null.droite, mais pas sur texte fichiers. Texte fichiers (
stdin
, le clavier, ...) n'ont pas intégré NULs. Modification du Code pour traiter avec que de toute façon. MerciVrai, il n'est pas commun pour le premier personnage à être le caractère null. La définition d'un fichier texte n'est pas formel et souvent n'excluent pas explicitement un
'\0'
. Pourtant, il n'est pas rare pour lire un UTF-16BE texte fichier qui n'a pas de NOMENCLATURE (en pensant que c'est un simple ASCII) fichier qui peut facilement commencer par un caractère nul. Si un clavier peut générer un caractère null ou pas, c'est une plate-forme de problème de niveau, au-delà du programme de contrôle. IMO c'est un hacker exploiter et robuste code copes. jusqu'vote pour l'amélioration de la réponse.OriginalL'auteur pmg
La
select
module propose une fonction appeléeselect
qui permet d'obtenir exactement ce que vous cherchez.select.select
prend trois arguments:Chaque argument doit être une liste de descripteurs de fichiers (tels que
[sys.sdtin]
) et puis, il attend jusqu'à ce qu'un opération e /s est disponible. Les opérations d'e /s sont read, write ou une autre exception sur les descripteurs de fichiers. Elle renvoie unetuple
de listes correspondantes rempli avec les descripteurs de fichier qui sont prêts.Donc, si il ya d'entrée en attente dans
sys.stdin
alors la fonction se comporte de la sorte:Par lui-même, cela ne résout pas votre problème car, par défaut, la fonction va attendre jusqu'à ce qu'une opération e /s est disponible. Il est important, cependant,
select.select
a une optiontimeout
argument indiquant combien de temps il faudra attendre avant d'abandonner. Il nous suffit de définir le délai d'attente à zéro et nous pouvons vérifier pour entrée sans bloquer le flux du programme.Nous allons voir un exemple où il n'y a pas d'entrée d'attente dans
sys.stdin
:Sachant que nous voulons seulement le premier élément de ce n-uplet (les flux d'entrée), nous sommes prêts à faire un utile si la déclaration:
Que les moyens de compensation du flux d'entrée a juste besoin de l'itération:
Et bien entendu, nous pouvons l'utiliser sur n'importe quel flux d'entrée, donc permet de le mettre dans une fonction:
Donc, nous allons démontrer notre fonction pour obtenir ce que vous demandez dans votre question:
La
clear_input
fonction peut être utilisée que de manière non-bloquante pour effacer les flux d'entrée et doivent travailler en Python2 et Python3.@jens /facepalm 🙂
La grande réponse. Juste une autre question.
Je suppose que le TLDR réponse est "utiliser Python" 🙂
OriginalL'auteur dsclose