5

我只是想知道这是否可能以及如何实现此功能,如果没有用户输入,我们将退出循环。例如,如果用户在 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();
}
4

3 回答 3

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;
        }
    }
}
于 2012-11-21T11:28:28.703 回答
1

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

double difftime ( time_t time2, time_t time1 );

计算 time1 和 time2 之间的秒差。

你不需要main()从内部打电话,main()我不知道你为什么会认为这是个好主意。

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

于 2012-11-21T10:53:14.140 回答
0

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

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

尽管 unix 风格的解决方案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");
    }
}
于 2012-11-21T11:02:52.323 回答