Input over term in standard C

I am currently completing my assignment, and it is required to use C-Free 5.0. I just need your help to solve this part of the puzzle. I want to implement a time limit for a user to enter a response before it expires. I tried this code, but it got a block in the scanf () function. Is there any other way, for example, to unlock the input or something else. I tried to implement " #include <sys/select.h> ", but this program does not have this library.

 #include <stdio.h> #include <string.h> #include <time.h> #include <stdlib.h> 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) < end) { scanf("%s", &st); if(st != NULL) { printf ("Thank you, you entered >%s<\n", st); exit(0); } } main(); } 
+4
source share
2 answers

Here is a sample program showing how you can use the O_NONBLOCK flag in a stdin file descriptor.

 #include <stdio.h> #include <time.h> #include <stdlib.h> #include <unistd.h> #include <fcntl.h> #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!"); } 
+1
source

Since you have fcntl.h , try installing stdin for non-blocking. This is not very (active waiting), but if you do not have select , then this is the easiest way:

 #include <stdio.h> #include <string.h> #include <time.h> #include <stdlib.h> #include <fcntl.h> #include <errno.h> 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; } 

Note to your code: if (st != NULL) will always execute, since st is a stack pointer.

0
source

All Articles