Comment puis-je empêcher le scanf() pour attendre éternellement un caractère d'entrée?
Que je veux accomplir les choses suivantes dans une application de console:
- Si l'utilisateur tape un caractère, l'application va faire le
la tâche correspondante. Par exemple, si les entrées de l'utilisateur1
, le programme
va faire tâche 1, si les entrées de l'utilisateurq
, le programme se ferme; - Si les entrées de l'utilisateur de rien, le programme fera la tâche par défaut toutes les 10 secondes (le temps n'a pas besoin d'être très strict).
Voici mon code:
#include <stdio.h>
#include <time.h>
char buff[64];
char command;
while(command != 'q')
{
begin:
printf(">> ");
scanf("%s", buff);
command = buff[0];
switch (command)
{
case '1':
//task 1 code will be added here;
break;
case '2':
//task 2 code will be added here;
break;
case 'q':
printf("quit the loop.\n");
break;
}
//wait for 10 seconds;
Sleep(10000);
//default task code will be added here;
if(command != 'q')
{
goto begin;
}
}
Mais le problème est que le programme va piéger à la ligne de scanf()
fonction pour toujours attendre pour l'entrée de caractères, si aucun caractère n'est saisi. Alors je me demandais comment faire pour ignorer la ligne de scanf()
après un certain temps, je veux dire par exemple, si pas d'entrée après 1 seconde, le programme peut continuer, de manière à remplir la deuxième chose énumérés ci-dessus.
La plate-forme de Windows, si il le faut.
j'ai enlevé le point-virgule après la while()
c'était une erreur évidente.
Je ne pense pas qu'il y a un moyen standard pour atteindre cet à - dire un délai d'attente. La plate-forme ciblez-vous ?
quelle plate-forme vous êtes sur. Si vous êtes sous linux, vous pourriez
goto commencer? vous êtes le tester dans la condition du while (qui se termine à la
double possible de Délai d'attente de la mise en œuvre en C pour TFTP
vous n'avez pas initialiser
quelle plate-forme vous êtes sur. Si vous êtes sous linux, vous pourriez
poll
ou select
pour voir si quelque chose se produit sur STDIN_FILENOgoto commencer? vous êtes le tester dans la condition du while (qui se termine à la
;
, donc supprimer ce), de sorte que vous n'en avez pas besoin (plutôt un "continuer"), ni la if
. — pour faire plus "interactive" de l'entrée, vous pouvez prendre un coup d'oeil à la bibliothèque ncurses; il y a de la documentation sur de SORTE que vous pourriez être intéressé, par exemple, here;peut-être que vous pouvez organiser quelque chose avec délai d'attente — mais bien sûr, votre code ne dépendent que de la bibliothèque qui ne fait pas partie de la std lib.double possible de Délai d'attente de la mise en œuvre en C pour TFTP
vous n'avez pas initialiser
command
donc la première boucle n'est pas défini. Aussi, supprimer ;
à la fin de la boucle while ou que votre programme ne boucle à tousOriginalL'auteur user3208536 | 2014-01-17
Vous devez vous connecter pour publier un commentaire.
Essayez d'utiliser la fonction select (). Ensuite, vous pouvez attendre 10 secondes jusqu'à ce que vous pouvez lire à partir de stdin sans blocage. Si select() renvoie zéro, effectuer l'action par défaut.
Je ne sais pas si cela fonctionne sur windows, c'est du standard POSIX. Si vous arrivez à développer sur unix/linux, essayez
man select
Je viens d'écrire un exemple de travail à l'aide de select:
Remarque: le sondage() de l'exemple ci-dessous est aussi OK, pas de problème. Pour le reste j'ai choisi de lire les octets disponibles dans une mémoire tampon (jusqu'à MAXBYTES). Il peut être (s)numérisé par la suite. (scanf() n'est pas trop mon ami, mais c'est un goût personnel).
Merci beaucoup Ronald et Graeme. Cependant, j'ai essayé l'exemple que Graeme suggéré, mais la fenêtre de commande affiche "Impossible de lire vos commentaires" pour toujours, et pas de délai entre les deux affichages. Alors je me demandais si d'autres choses devraient être payés à l'attention de la configuration de l'
select()
fonction et de son initialisation, commeFD_ZERO
etFD_SET
. je vous remercie beaucoup.Merci Ronald, je vous remercie beaucoup pour votre code. J'ai essayé ton code, mais la valeur de num_readable est toujours -1, je ne peux pas utiliser le clavier pour quoi que ce soit entrée. aussi, je ne trouve pas le fichier de tête
unistd.h
, donc je ne peux pas utiliser leread()
fonction. Je suis l'aide de Microsoft Visual C++ 2010 Express dans Windows 7.Je peux trouver de la
read()
de la fonction dans le fichier de têteio.h
.OK, j'ai raté votre remarque sur l'utilisation de windows. Je ne suis pas vraiment un spécialiste de windows, mais read() ne veut pas faire quelque chose de spécial. Fondamentalement, vous avez besoin d'une fonction qui lit l'entrée standard stdin sans bloquer si il ne peut pas lire autant de caractères que fit dans sa mémoire tampon. Je pense qu'il est appelé ReadFile() dans Windows. Au lieu de strerror (), vous pourriez vouloir utiliser FormatMessage().
OriginalL'auteur Ronald
Ici est un exemple de la façon de le faire avec
poll
(probablement le plus "correct" de façon sous Linux):Le délai d'attente est le troisième argument de
poll
et est en millisecondes - cet exemple va attendre 2 secondes pour l'entrée sur stdin. Windows aWSAPoll
, qui devrait fonctionner de la même façon.WSAPoll
est seulement pour les sockets.OriginalL'auteur Graeme
Supprimez le point-virgule après
while
.Il est tout au sujet de la première question.
OriginalL'auteur haccks
Essayer d'alarme(3)
alarm()
, merci.OriginalL'auteur lbaby
Comme d'autres l'ont dit, la meilleure façon de le faire vraiment async IO est avec
select(...)
.Mais d'une façon rapide et sale pour faire ce que vous voulez, c'est avec
getline(...)
qui retourne le nombre d'octets lus à chaque fois (pas accroché sur IO) et renvoie -1 en cas d'absence d'octets à lire.Ce qui suit est le getline(3) l'homme page:
getline(...)
, et quel est le sens de la troisième paramètrefp
, merci.Encore une fois, c'est directement à partir de
man getline
: "Bibliothèque Standard C (libc, -lc)".#include <stdio.h>
fp
est le pointeur de fichier que vous lisez à partir d', comme la norme dans ou quelque chose.OriginalL'auteur mellowfish