Как использовать scanf, не останавливая язык программы C? - PullRequest
0 голосов
/ 28 сентября 2019

Я делаю счетчик, где я показываю, сколько секунд пользователь должен сделать ввод.Проблема в том, что когда я использую 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);
        }

Что я могу сделать, чтобы решить эту проблему?

1 Ответ

2 голосов
/ 28 сентября 2019

Как упомянуто в комментариях, одной из возможностей будет использование опроса.

man poll говорит:

poll () проверяет набор файловых дескрипторов, чтобы определить, готовы ли некоторые из них к вводу-выводу или произошли определенные события на них.

В коде это может выглядеть так:

#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;
}
...