4

我想在 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");
  }
}

那么,等待“scanf”功能 5 秒的代码是什么,否则执行 if-else 部分。

4

3 回答 3

9

尝试一个 select(2) 循环:https ://www.mirbsd.org/man2/select on stdin (fd#0),超时 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);很重要,以便首先显示提示......</p>

于 2013-10-04T16:14:50.220 回答
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;
}
于 2013-10-04T16:40:38.950 回答
0

好吧,您可以使用halfdelay()curses 库中的函数

于 2013-10-04T16:51:36.843 回答