3

我有组标准输入,每当用户键入并点击时select(),我想从标准输入中获取一个字符串Enter

但是 select 正在触发stdin,因为它在被击中之前准备好读取Enter,并且在极少数情况下,在输入任何内容之前。这会挂起我的程序,getstr()直到我点击Enter.

我尝试了设置nocbreak(),它真的很完美,只是屏幕上没有回显,所以我看不到我在输入什么。设置echo()不会改变这一点。

我也尝试过使用timeout(0),但结果更加疯狂并且没有用。

4

1 回答 1

1

您需要做的是使用 getch() 函数检查字符是否可用。如果您在无延迟模式下使用它,该方法将不会阻塞。然后你需要吃掉这些字符,直到你遇到一个'\n',然后将每个字符附加到结果字符串中。

或者——我使用的方法——是使用 GNU readline 库。它支持非阻塞行为,但关于该部分的文档不是那么好。

此处包含一个您可以使用的小示例。它有一个选择循环,并使用 GNU readline 库:

#include <stdio.h>
#include <readline/readline.h>
#include <readline/history.h>
#include <stdlib.h>
#include <stdbool.h>

int quit = false;

void rl_cb(char* line)
{
    if (NULL==line) {
        quit = true;
        return;
    }

    if(strlen(line) > 0) add_history(line);

    printf("You typed:\n%s\n", line);
    free(line);
}

int main()
{
    struct timeval to;
    const char *prompt = "# ";

    rl_callback_handler_install(prompt, (rl_vcpfunc_t*) &rl_cb);

    to.tv_sec = 0;
    to.tv_usec = 10000;

    while(1){
        if (quit) break;
        select(1, NULL, NULL, NULL, &to);
        rl_callback_read_char();
    };
    rl_callback_handler_remove();

    return 0;
}

编译:

gcc -Wall rl.c -lreadline
于 2009-11-10T10:16:00.697 回答