繁体   English   中英

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

[英]Terminating scanf programmatically in C language

我正在Linux操作系统上使用C语言进行编程。 我正在写一个程序来扫描用户的输入。 但是,我希望scanf有一定的时间限制。 例如,如果用户在10秒钟内未在键盘上输入任何内容,它将跳过scanf并转到下一行。 我正在使用alarm(10)等待10秒,但是当我转到alarmhandler时,我不知道该如何跳过scanf。

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

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

从警报处理程序返回; 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;
}

您可能要考虑使用ncurses而不是标准I / O。 这有点不可思议,但是它使您免受各种编码方面的麻烦(可移植性和“您必须完全正确地编写此代码,否则它将无法可靠地工作,并且祝您找到好运的文档”)。 Halfdelay函数似乎提供了一种正是您在此寻找的模式。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM