Entrée dans une limite de temps en standard C

Je suis en train de faire mon travail et il est obligatoire d’utiliser C-Free 5.0. Vous avez juste besoin de votre aide pour résoudre ce casse-tête. Je souhaite mettre en place une limite de temps pour que l’utilisateur saisisse une réponse avant son expiration. J’ai essayé ce code mais il a bloqué la fonction scanf (). Existe-t-il une autre méthode comme une entrée de déblocage ou autre chose? J’ai essayé d’implémenter ‘ #include ‘ mais ce programme n’a pas cette bibliothèque.

 #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(); } 

Voici un exemple de programme qui montre comment utiliser l’indicateur O_NONBLOCK sur un descripteur de fichier 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!"); } 

Depuis que vous avez fcntl.h essayez de définir stdin sur non bloquant. Ce n’est pas joli (attente active), mais si vous n’avez pas select c’est le moyen le plus simple d’aller:

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

Une remarque à propos de votre code: if (st != NULL) sera toujours satisfait puisque st est un pointeur de stack.