How to deactivate input statement after some time?

后端 未结 3 1888
夕颜
夕颜 2020-12-18 08:02

We know input function or operator (cin, scanf,gets….etc) wait to take input form user & this time has no limit.

Now, I will ask a question & user give the a

3条回答
  •  被撕碎了的回忆
    2020-12-18 08:23

    Another Method:
    You can use POSIX select() function (and some macros FD_ZERO, FD_SET, FD_ISSET) to check which file descriptors (descriptor number 0 i.e. stdin, in this case) are ready to be read in a given time interval. When they are ready, use appropriate function to read the data (scanf() in this case).
    This code might help you understand, what I want to say:

    #include 
    #include 
    #include 
    
    #define STDIN    0    // Standard Input File Descriptor
    int main()
    {
        fd_set input;       // declare a "file descriptor set" to hold all file descriptors you want to check
        int fds, ret_val, num;  // fds: Number of file descriptors;
    
        struct timeval tv;      // structure to store Timeout value in the format used by select() function
        unsigned int timeout = 5;   // Your timeout period in seconds
    
        tv.tv_sec = timeout;    
        tv.tv_usec = 0;
    
        fds = STDIN + 1;            // Set number of file decriptors to "1 more than the greatest file descriptor"
                    // Here, we are using only stdin which is equal to 0
    
        FD_ZERO(&input);        // Initialize the set with 0
        FD_SET(STDIN, &input);      // Add STDIN to set
    
        printf("Enter a number within %d secs\n", timeout);
        ret_val = select(fds, &input, NULL, NULL, &tv); 
                    // We need to call select only for monitoring the "input file descriptor set"
                    // Pass rest of them as NULL
    
        if (ret_val == -1)          // Some error occured
            perror("select()");
        else if (ret_val > 0)       // At least one of the file descriptor is ready to be read
        {
    //      printf("Data is available now.\n");
            if(FD_ISSET(0, &input))     // Check if stdin is set, here its not necessary as we are using STDIN only
                    // So ret_val>0 means STDIN is raedy to read 
            {
                scanf("%d", &num);
            }
        }
        else
            printf("No data within five seconds.\n");   // select returns zero on timeout
    
        return 0;
    }
    

    More Help: select(2)

    You can also try using poll() function available in (again a POSIX standard function) as an alternative to select(). See poll() & poll(2)

提交回复
热议问题