Espera solo 5 segundos para la entrada del usuario

Quiero escribir un progtwig c simple en el editor turbo c ++ 4.5 de modo que solo espere 5 segundos para que el usuario ingrese información. Como ejemplo,

#include  void main() { int value = 0; printf("Enter a non-zero number: "); // wait only 5 seconds for user input scanf("%d",&value); if(value != 0) { printf("User input a number"); } else { printf("User dont give input"); } } 

Entonces, cuál será el código durante 5 segundos, espere la funcionalidad ‘scanf’ y, de lo contrario, ejecute if-else part.

Pruebe con un bucle select (2): https://www.mirbsd.org/man2/select en stdin (fd # 0) con un tiempo de espera de 5 segundos; ejecute scanf (3) solo si select retorna indicando que hay datos. (Consulte la función c_read () en el código fuente de mksh para ver un ejemplo).

Otras funciones, como poll (2), también son posibles. La E / S sin locking es un poco exagerada.

OK, aquí hay un ejemplo de trabajo (en MirBSD) usando select:

 #include  #include  #include  #include  #include  #include  int main(void) { int value = 0; struct timeval tmo; fd_set readfds; printf("Enter a non-zero number: "); fflush(stdout); /* wait only 5 seconds for user input */ FD_ZERO(&readfds); FD_SET(0, &readfds); tmo.tv_sec = 5; tmo.tv_usec = 0; switch (select(1, &readfds, NULL, NULL, &tmo)) { case -1: err(1, "select"); break; case 0: printf("User dont give input"); return (1); } scanf("%d", &value); if (value != 0) { printf("User input a number"); } else { printf("User dont give input"); } return (0); } 

Es posible que desee jugar un poco con los códigos de salida y esparcir algunos \ n en todo el código. El fflush(stdout); Es importante para que el aviso se muestre en primer lugar …

 #include  #include  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; } 

Bueno, puedes usar la función halfdelay() de la biblioteca de curses.