Entrada dentro de un límite de tiempo en el Estándar C

Actualmente estoy haciendo mi tarea y es obligatorio usar C-Free 5.0. Solo necesito tu ayuda para resolver este puzzle. Quiero implementar un límite de tiempo para que el usuario ingrese una respuesta antes de que caduque. He intentado este código pero tengo locking en la función scanf (). ¿Hay algún otro método como una entrada de deslocking o algo así? He intentado implementar ‘ #include ‘ pero este progtwig no tiene esa biblioteca.

 #include  #include  #include  #include  int main() { char st[10]; printf ("Please enter a line of text : "); time_t end = time(0) + 5; //5 seconds time limit. while(time(0) %s<\n", st); exit(0); } } main(); } 

Aquí hay un progtwig de ejemplo que muestra cómo puede usar la bandera O_NONBLOCK en un descriptor de archivo stdin .

 #include  #include  #include  #include  #include  #define INPUT_LEN 10 int main() { printf ("Please enter a line of text : "); fflush(stdout); time_t end = time(0) + 5; //5 seconds time limit. int flags = fcntl(STDIN_FILENO, F_GETFL, 0); fcntl(STDIN_FILENO, F_SETFL, flags | O_NONBLOCK); char answer[INPUT_LEN]; int pos = 0; while(time(0) < end) { int c = getchar(); /* 10 is new line */ if (c != EOF && c != 10 && pos < INPUT_LEN - 1) answer[pos++] = c; /* if new line entered we are ready */ if (c == 10) break; } answer[pos] = '\0'; if(pos > 0) printf("%s\n", answer); else puts("\nSorry, I got tired waiting for your input. Good bye!"); } 

Ya que tienes fcntl.h intenta configurar stdin para no bloquear. No es bonito (espera activa), pero si no tiene select , esta es la forma más fácil de hacerlo:

 #include  #include  #include  #include  #include  #include  int main() { // get stdin flags int flags = fcntl(0, F_GETFL, 0); if (flags == -1) { // fcntl unsupported perror("fcntl"); return -1; } // set stdin to non-blocking flags |= O_NONBLOCK; if(fcntl(0, F_SETFL, flags) == -1) { // fcntl unsupported perror("fcntl"); return -1; } char st[1024] = {0}; // initialize the first character in the buffer, this is generally good practice printf ("Please enter a line of text : "); time_t end = time(0) + 5; //5 seconds time limit. // while while(time(0) < end // not timed out && scanf("%s", st) < 1 // not read a word && errno == EAGAIN); // no error, but would block if (st[0]) // if the buffer contains something printf ("Thank you, you entered >%s<\n", st); return 0; } 

Una observación a su código: if (st != NULL) siempre se cumplirá ya que st es un puntero de stack.