【问题标题】:How to use scanf without stopping the program C language?如何在不停止程序C语言的情况下使用scanf?
【发布时间】:2019-09-28 02:30:54
【问题描述】:

我正在做一个计数器,显示用户必须输入多少秒。问题是当我使用 scanf() 时,程序将停止并等待答案,但我不希望这样。即使用户没有放任何东西,我也想继续运行计数器。

例子:

for(int i=10;i>=0;i--){
            i==0? printf("time over\n"):printf("%d seconds left\n",i);
            scanf("%s", decision);
            sleep(1);
        }

我能做些什么来解决这个问题?

【问题讨论】:

  • 你必须使用线程来实现它
  • 你使用的是什么操作系统?
  • @mangusta 在Linux上,你可以在stdin:stackoverflow.com/questions/717572/…上做非阻塞IO
  • 这并不容易。使用线程是一种方式,虽然不是唯一的方式。您还可以考虑进行即时、非阻塞、一次一个字符的输入。 (这不会涉及scanf!)
  • 使用select, pselect, poll or epoll然后轮询一组带有超时设置的文件描述符是一种方法,手动使用信号处理程序是另一种方法。 scanf 甚至没有进入跑步。

标签: c input counter


【解决方案1】:

就像 cmets 中提到的,一种可能性是使用 poll。

man poll 说:

poll() 检查一组文件描述符以查看其中一些是否是 为 I/O 做好准备,或者它们是否发生了某些事件。

在代码中可能如下所示:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/poll.h>
#include <stdbool.h>

int main() {
    struct pollfd fds[1];
    fds[0].fd = STDIN_FILENO;
    fds[0].events = POLLIN;

    bool dataAvailable = false;
    for (int i = 10; i >= 0 && !dataAvailable; i--) {
        switch (poll(fds, 1, 1000)) {
            case -1:
                perror("poll failed");
                exit(1);
            case 0:
                printf("%d seconds left\n", i);
                break;
            default:
                dataAvailable = true;
        }
    }

    if (dataAvailable) {
        //read from stdin
    } else {
        fprintf(stderr, "no input\n");
        exit(1);
    }

    return 0;
}

【讨论】:

  • 这太棒了,但我还想做一件事。调用 scanf 时,之后出现的秒数消息,移动控制台的光标,它不会让我看到我想要放置的整个字符串。我该如何解决这个问题?示例:10 seconds left my str9 seconds left ing is 8 seconds left thi7 seconds left s
  • 我会出于这样的目的使用 ncurses。它允许您定义基于文本的 UI,您可以在终端的特定屏幕位置显示倒计时,并在另一个屏幕位置输入数据。
猜你喜欢
  • 1970-01-01
  • 2021-09-18
  • 2013-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多