3

セットに標準入力があり、ユーザーが入力してヒットするたびに標準select()入力から文字列を取得したいと考えています。Enter

ただし、select は、ヒットする前、およびまれに、何かがまったく入力される前に、ready to read として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 に答える