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