2010-10-30 4 views
1

Je programme en utilisant le langage C sur un système d'exploitation Linux. J'écris un programme qui analyse une entrée de l'utilisateur. Cependant, je veux que le scanf ait une certaine limite de temps. Par exemple, si l'utilisateur ne saisit rien sur le clavier avec 10 secondes, il passera le scanf et passera à la ligne suivante. J'utilise l'alarme (10) pour attendre 10 secondes, mais quand je vais à l'alarmhandler je ne sais pas quoi faire pour passer le scanf.Terminer scanf par programmation en langage C

Y a-t-il une fonction pour sauter scanf ou par exemple écrire \ n dans le tampon d'entrée?

Répondre

2

Vous pouvez utiliser select(2) ou poll(2) pour spécifier un délai et vérifier si stdin a une entrée.

1

Retour du gestionnaire d'alarmes; La valeur de retour de scanf doit refléter qu'une condition d'erreur s'est produite. (scanf renvoie EOF en cas d'erreur).

REMARQUE! Vous DEVEZ utiliser sigaction, car signal peut faire read(), l'appel système sous-jacent scanf() peut être redémarré automatiquement.

#include <stdio.h> 
#include <signal.h> 

void handler(int signo) 
{ 
    return; 
} 

int main() 
{ 
    int x; 
    struct sigaction sa; 

    sa.sa_handler = handler; 
    sigemptyset(&sa.sa_mask); 
    sa.sa_flags = 0; 
    sigaction(SIGALRM, &sa, NULL); 

    alarm(5); 

    if (scanf("%d", &x) == 1) 
    { 
    printf("%d\n", x); 
    alarm(0); // cancel the alarm 
    } 
    else 
    { 
    printf("timedout\n"); 
    } 
    return 0; 
} 
0

Vous voudrez peut-être envisager d'utiliser ncurses au lieu d'E/S standard. C'est un peu mystérieux, mais il vous isole de toutes sortes de nuisances de codage (à la fois la portabilité et "vous devez coder cela exactement ou ne fonctionnera pas de manière fiable, et bonne chance de trouver de la documentation"). Et la fonction halfdelay semble fournir un mode qui est précisément ce que vous cherchez ici.

Questions connexes