Exits the loop after a certain amount of time if there's no input

匿名 (未验证) 提交于 2019-12-03 02:30:02

问题:

I'm just wondering whether is it possible and how do I implement this feature, where we exit from the loop if there's no input from the user. For example, I want to exit the loop if the user does not input anything after 1 minute. Here's my C code :

#include <stdio.h> #include <conio.h> #include <time.h>  int main(void) {     int x;     time_t end = time(0) + 60;     printf("Enter a number : ");      while (time(0) < end)     {         if((scanf("%d", &x)) != EOF || (getchar() != '\n'))         {             time_t end2 = time(0) + 60;             while(time(0) < end2);             main();         }         else         {             printf("%d", x);             main();         }     }     main(); } 

回答1:

Use select() function to set a timeout for your scanf

The following code is an example of how use it.

#include <stdlib.h> #include <stdio.h> #include <sys/time.h>  int main(void) {     int x;     fd_set          set;     struct          timeval timeout = {0};      FD_ZERO(&set);      while(1)    {         timeout.tv_sec = 30;         FD_SET(fileno( stdin ), &set);         printf ("enter a number:");         fflush (stdout);         if (select(FD_SETSIZE, &set, NULL, NULL, &timeout))         {             scanf("%d", &x);            printf("The number you put is %d\r\n",x);          }         else         {                 printf("\r\nTimeout: Stop reading\r\n");                 break;         }     } } 


回答2:

Although the time_t structure returned by time() is most likely a number of seconds, you should not be performing maths on it. Instead use difftime()

double difftime ( time_t time2, time_t time1 ); 

Calculates the difference in seconds between time1 and time2.

You do not need to call main() from within main() and I'm not sure why you would think that is a good idea.

Also, getchar() will wait for a key to be pressed, so it won't be counting time in the background.



回答3:

This task is usually done using threads. In one thread getchar is called which blocks the thread execution, another thread does sleep() and then kills the first thread.

Another way to do this is to use non-blocking read() from the standard input using pselect (2), but it's more tricky and does not suit small applications well.

Though a solution with pthreads in unix-style is quite verbose:

#include <stdio.h> #include <unistd.h> #include <time.h> #include <pthread.h>  struct read_int {     int success;     int value;     struct timespec timeout; };  void* read_thread(void *arg) {     struct read_int *s = arg;     printf("Enter a number: ");     scanf("%d", &s->value);     s->success = 1;     return NULL; }  #define CHECK_RET(ret, func) \     if (ret) { fprintf(stderr, func"() == %d\n", ret); return ret; }  int main() {     pthread_t rthr;     pthread_attr_t thr_attr;      struct read_int s = { 0 };     int ret;      ret = clock_gettime(CLOCK_REALTIME, &s.timeout);     if (ret == -1) { fprintf(stderr, "clock_gettime() == %d\n", ret);  return ret; }      s.timeout.tv_sec += 5;      ret = pthread_attr_init(&thr_attr);     CHECK_RET(ret, "pthread_attr_init");      ret = pthread_create(&rthr, &thr_attr, read_thread, &s);     CHECK_RET(ret, "pthread_create");      ret = pthread_attr_destroy(&thr_attr);     CHECK_RET(ret, "pthread_attr_destroy");      pthread_timedjoin_np(rthr, NULL, &s.timeout);      if (s.success) {         printf("\ngot value %d\n", s.value);     } else {         pthread_cancel(rthr);         printf("\nTimed out, exiting...\n\n");     } } 


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!