如果没有输入,则在一定时间后退出循环

时间:2012-11-21 10:40:23

标签: c

我只是想知道是否可能以及如何实现此功能,如果用户没有输入,我们将退出循环。例如,如果用户在1分钟后没有输入任何内容,我想退出循环。这是我的C代码:

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

3 个答案:

答案 0 :(得分:2)

使用select()功能为scanf设置超时

以下代码是如何使用它的示例。

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

答案 1 :(得分:1)

虽然time()返回的time_t结构很可能是几秒钟,但您不应该对它执行数学运算。而是使用difftime()

double difftime ( time_t time2, time_t time1 );

计算time1和time2之间的秒数差异。

您无需在main()内拨打main(),我不确定为什么您会认为这是一个好主意。

此外,getchar()将等待按下某个键,因此它不会在后台计算时间。

答案 2 :(得分:0)

此任务通常使用线程完成。在一个线程getchar被调用阻塞线程执行,另一个线程执行sleep()然后杀死第一个线程。

另一种方法是使用read()从标准输入中使用非阻塞pselect (2),但它更棘手,并不适合小应用程序。

虽然unix-style中带有pthreads的解决方案非常详细:

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