【问题标题】:Terminating scanf programmatically in C language在 C 语言中以编程方式终止 scanf
【发布时间】:2010-10-30 13:32:39
【问题描述】:

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

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

【问题讨论】:

    标签: c linux scanf


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        您可能需要考虑使用ncurses 而不是标准 I/O。这有点神秘,但它使您免受各种编码麻烦(包括可移植性和“您必须对它进行完全正确的编码,否则它将无法可靠地工作,祝您好运找到文档”)。 halfdelay 函数似乎提供了一种正是您在这里寻找的模式。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-01-13
          • 2015-05-31
          • 2021-03-05
          • 2015-02-11
          • 1970-01-01
          相关资源
          最近更新 更多