我想在turbo c ++ 4.5编辑器中编写一个简单的c程序,这样用户输入只需要等待5秒钟。例如,
#include <stdio.h>
void main()
{
int value = 0;
printf("Enter a non-zero number: ");
// wait only 5 seconds for user input
scanf("%d",&value);
if(value != 0) {
printf("User input a number");
} else {
printf("User dont give input");
}
}
那么,5秒的代码将等待'scanf'功能,否则执行if-else part。
答案 0 :(得分:9)
在stdin(fd#0)上尝试select(2)循环:https://www.mirbsd.org/man2/select,超时为5秒;仅当select返回表示存在数据时才运行scanf(3)。 (有关示例,请参阅mksh源代码中的c_read()函数。)
其他功能,如poll(2),也是可能的。非阻塞I / O有点矫枉过正。
好的,这是一个使用select:
的工作(在MirBSD上)#include <sys/types.h>
#include <sys/time.h>
#include <err.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
int
main(void)
{
int value = 0;
struct timeval tmo;
fd_set readfds;
printf("Enter a non-zero number: ");
fflush(stdout);
/* wait only 5 seconds for user input */
FD_ZERO(&readfds);
FD_SET(0, &readfds);
tmo.tv_sec = 5;
tmo.tv_usec = 0;
switch (select(1, &readfds, NULL, NULL, &tmo)) {
case -1:
err(1, "select");
break;
case 0:
printf("User dont give input");
return (1);
}
scanf("%d", &value);
if (value != 0) {
printf("User input a number");
} else {
printf("User dont give input");
}
return (0);
}
您可能希望稍微使用退出代码,并在整个代码中添加一些\ n。 fflush(stdout);
非常重要,因此首先会显示提示...
答案 1 :(得分:2)
#include <stdio.h>
#include <signal.h>
void handler(int signo)
{
return;
}
int main()
{
int x;
struct sigaction sa;
sa.sa_handler = handler;
sigemptyset(&sa.sa_mask);
sa.sa_flags = 0;
sigaction(SIGALRM, &sa, NULL);
alarm(5);
if (scanf("%d", &x) == 1)
{
printf("%d\n", x);
alarm(0); // cancel the alarm
}
else
{
printf("timedout\n");
}
return 0;
}
答案 2 :(得分:0)
你可以使用curses库中的halfdelay()
函数