1

プログラムの getch 関数を書きました。iostream すでに使用している端末が壊れるため、curses を使用できませんでした。コード:

inline std::string getch() {
    char inp[4];
    system("stty raw");
    inp[0] = std::cin.get();
    if(inp[0] == 27 && (inp[1] = std::cin.get()) != std::char_traits<char>::eof()) {
        std::cin>>inp[2];
        inp[3] = '\0';
    }
    else {
        inp[1] = '\0';
    }
    system("stty cooked echo");
    return std::string(inp);
}

termios.hシステムコールの代わりに使用する方が良いことはわかっています。の場合を除いて、すべて正常に動作しESC keyます。たとえば の文字列である矢印をキャプチャしようとしています"\1B[A"。最初の文字として検出するESCと、2 番目の 2 文字も読み取って完全なキー コードを取得します。ESC問題は、コードが 1B だけであるため、押しても発生しないはずです。読み取り中にバッファーが空の場合は、単に停止する必要cin.get()があります。return EOF

呪いを使わずにESCキーオンを読む方法はありますか? linuxソリューションが機能しないのはなぜですか?

ありがとう

4

1 に答える 1

1

何時間も検索した後、解決策を見つけました。unistd.h の read 関数を使用する必要がありました。入力からの文字で、指定されたサイズの配列を埋めます。キーが押されると、バッファは読み取られたすべての文字で満たされます (複数のキーでも機能します)。したがって、ESC は単純に {27,0,0,...,0} と矢印 {27,'[','A',0,0,...,0} を持ちます。termios.h を使用して関数を書き直してライブラリに配置したので、誰でも恩恵を受けることができます。

コードは次のとおりです: github の readkey

于 2013-12-09T16:00:05.243 に答える