1

コンソール入力 (stdin、std::cin) を処理する場合、C++ には、ユーザーが次のように実行できるさまざまなアクションを管理するための移植可能な方法があります。

  1. バックスペース/削除
  2. リスト項目
  3. 左/右矢印キー (カーソルを前後に移動してテキストを挿入)

たとえば、Windows で std::cin を使用する場合 (例: std::cin >> s;)、矢印キーを使用できますが、Linux で同じコードを使用する場合、矢印キーは入力の一部と見なされます。 、カーソルは移動しません。

そのような機能を提供する curses や ncurses などのさまざまな TUI フレームワークを知っていますが、それらは必要以上のものです。

標準ライブラリに基づく単純なソリューション、またはより一般的な OS 間で移植可能な std::getline のような機能を備えた軽量のオープン ソース ライブラリさえあることを願っています。

4

2 に答える 2

1

通常、バックスペースや削除などはシステムによって処理されます。端末から読み取る場合、ユーザーがEnterキーを押したときにのみ入力を取得します。

システムが行うことは通常、かなり制限されています。特に、ファイル名の補完などを行うものは知りません。システムの機能以上のものが必要な場合は、readline多くの GNU プログラム (bash、gdb など) で使用されているライブラリを調べることをお勧めします。それを使用するアプリケーションとは別に利用できます。(2 つの小さな警告: ネイティブ Windows に対するサポートがどれほど優れているかはわかりません。また、ライセンスが GPL か LGPL かはわかりません。)

于 2013-05-01T08:03:58.880 に答える
0

readline は Linux に適していますが、GPL です! 次のコードを使用して、Windows と Linux でコンパイルします。

#ifdef USE_READLINE
    #include <readline/readline.h>
    #include <readline/history.h>
#endif
...
void getline(char *buf)
{
    #ifdef USE_READLINE
            char *tmp;
            tmp = readline(PROMPT);
            if(strncmp(tmp, buf, MAXLENGTH)) add_history(tmp);      // only add new content
            strncpy(buf, tmp, MAXLENGTH);
            buf[MAXLENGTH]='\0';    
            free(tmp);
    #else
            std::cout<<PROMPT;
            std::cin.get(buf,MAXLENGTH);
            std::cin.ignore(); // delete CR
    #endif
}
于 2013-05-01T11:54:04.323 に答える