2011-09-09 6 views
2

のgetlineを使用してユーザ入力(CIN、mystrvar)を読み出して解釈された、いくつかのコントロールキーは機能しません。コントロールキー(左矢印)は、標準入力に送信される(^ [[D)に代えて

例:

User input: abc^[[Dd 
Text: abd 
User input: asc 
Read bytes: 7 
#0: 97 
#1: 98 
#2: 99 
#3: 27 
#4: 91 
#5: 68 
#6: 100 

私は、B、C、そして左矢印とDを入力しました。 "Text:"は最初の3文字を明示的に書き出し(cout)、ポインタを左に設定してcを上書きします。 "asc"は、長さ(mystrvar.size())とascii値を出力する簡単な関数です。

"stty -ctlecho"(システム(...))を呼び出すと、左矢印キーを使用できますが、入力に制限されません(「ユーザー入力:」を上書きできます)。制御コードはまだ私のプログラムに送られています。

これは、Windows上では発生しません - 私は普通(歴史のためにも、アップ/ダウン)の矢印キーを使用することができます。

ここで何が間違っていますか?

編集:私は主にlxterminal、ターミナル、xtermの、konsoleの、gnome-terminalの(端末など)やbash、kshの、tcshの(シェルなどの間に違いがあるようには思えないのFedora 15を使用しています)。これらのキーの動作方法

答えて

2

は端末のではなく、C++プログラムのプロパティです。プログラムは入力行をバッファに入れ、あなたの端末はその行をアセンブルします。

+0

だから私は何とか端末を設定する必要がありますか?どうすればいい? – basic6

+1

@ basic6 'rlwrap'は' readline'機能を有効にする簡単なツールです。あなたのプラットフォームで利用可能かもしれません。 –

+0

@ basic6:私はあなたが使っている端末が分からないので、私は少しも考えていません。それはとにかく追加の質問でなければなりません。そして恐らくSO上ではなく、恐らく端末の詳細なマニュアルを読んだ後でなければなりません。 – PlasmaHH

0

PlasmaHHが正しいです、それらのキーがどのように扱われるかは端末によって異なります。しかし、それだけではありません:シェルインタプリタもその役割を果たします。

とても簡単提案:最後;-)

だけの打ち上げ「はbash」で私のマシン上で(デフォルトでは正確にこれらのキーを処理して、再試行してください使用「のbash」、。

+0

私はすでにそれを試しています(そしてksh) - 違いがないようです(私は主にFedoraを使用していますが、違いがあります)。 – basic6

+0

また、あなたはプログラムを起動した方法に依存することができます。execを使用するとシェルプロセスを踏みにじる可能性があります...パテを使用してLinuxシステムに接続しており、everythignがそこに混乱している可能性があります – PlasmaHH

+0

PuTTY(またはその他のリモート接続)を使用します。 – basic6

0

もう一度やり直してください。あなたはあなたのインライン編集機能を提供していると思います

?もちろん、

ないあなたのプログラムを(押す前など、戻って削除する機能は、入力してください)。だからそれは別のプログラムでなければならない。どれ ?それはシェルではないので、あなたが使用しているコンソールを言うでしょう。それはWindowsのcmdのプロンプトがこの機能を提供するように見えます。 Linuxコンソールもそれを提供するはずですが、非アクティブ化されているか、パケットが必要です。

あなたは、リモート接続を使用していないと言います。しかし、あなたはどんなコンソールを使っていますか? "konsole"(kdeコンソール)またはシステムに存在する可能性のある他の亜種を試してみてください。

これらの特殊キーを解釈するいかなるプログラムが存在しない場合、それは(標準入力を受け取る)プログラムを行うには何も持っていませんが、彼らはただ...入力バッファに

+0

はい、私はそれを持っています。私が知らないのは、端末に自分のプログラムに送るのではなく、それらのコントロールキーを解釈するように端末に指示する方法です。とにかく私が得られないのは、なぜ彼らがプログラムに送られるのかということです。私はバックスペースを使うことができますが、私は戻ってDELETEを使うことができないので、インライン編集は部分的にしか動作しません。私には分かりません。すべてをプログラムに送るか、コントロールキーを解釈します。後者はデフォルトにする必要があります。私が間違っているなら、私を修正してください。ああ、私はkonsoleを試しました - 同じこと。 – basic6

+0

さて、あなたはそれらを試してみたので、私は提案から外れています...私は質問に興味があり、誰かが答えを見つけたら興味があります... – Offirmo

0

を付加され、私は回避策が見つかりました。プログラムの動作が若干異なります。

#include <readline/readline.h> 
#include <readline/history.h> 

string blah() 
{ 
    string str; 

    cout << "User input (readline): "; 

    char *inp_c = readline(""); //Instead of getline() 

    str = (const char *)(inp_c); //Because C strings stink 

    //... 

    return str; 
} 

これは機能します。 Windowsでコンパイルできませんでした。 エラー:readline/readline.h:そのようなファイルやディレクトリがありません これは標準ヘッダーではないため、最初にインストール/インストールする必要があります。

誰かがより良い方法を知っている場合は、私に教えてください!

関連する問題