以C语言以编程方式终止scanf

时间:2010-10-30 13:32:40

标签: c linux scanf

我正在Linux OS上使用C语言进行编程。我正在编写一个扫描用户输入的程序。但是,我希望scanf有一定的时间限制。例如,如果用户在10秒内没有在键盘上输入任何内容,它将跳过scanf并转到下一行。我正在使用闹钟(10)等待10秒,但是当我去警报器时,我不知道该怎么办才能跳过scanf。

是否有跳过scanf的函数或例如将\ n写入输入缓冲区?

3 个答案:

答案 0 :(得分:2)

您可以使用select(2)poll(2)指定超时并检查stdin是否有输入。

答案 1 :(得分:1)

从警报处理程序返回; scanf的返回值应该反映出错误情况已经发生。 (scanf在出错时返回EOF)。

请注意!您必须使用sigaction,因为signal可能会read(),系统调用基础scanf()会自动重启。

#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)

您可能需要考虑使用ncurses而不是标准I / O.这有点神秘,但它可以使你免受各种编码滋扰(可移植性和“你必须完全正确地编码,或者它不能可靠地工作,以及找到文档的好运”)。并且halfdelay函数似乎提供了一种正是您正在寻找的模式。