2016-05-26 9 views
1

私はこれを誤って次のコードで気づいた。私はbashの履歴を確認するために筋肉の記憶の外にいた上矢印を押すと、次のコードでは、C++ Ansiのエスケープコードとその解釈を手作業で行うと

char teststring[20]; 
cin.getline(teststring, 20); 

ユーザ入力のためのプロンプトを停止し、そして、それは詳細を(ANSIエスケープコードを印刷しましたhere^[[A^[[A私は1つのバックスペースを押してEnterキーを押したときにAという文字が削除され、^[[ではなく読み込み不能なガベージが印刷されましたが、同じキーを手動で入力したときやコピーし直したときそれは最後の手紙なしでASCIIで同様の見える記号ではない)、それは^[[を印刷しました。 入力した文字は同じですが、どのような理由がありますか?

This is the output

+0

unix.stackexchange.comの方が適しているので、この質問を議論の対象外とすることにしました。 – chepner

答えて

2

Unixのターミナルは、非常に複雑な獣です。 Posixには、機能のpretty thorough descriptionが含まれています。以下は簡単な要約です。

通常、端末入力デバイスは「標準」モードで動作します。このモードでは、ターミナル・ドライバはライン・バッファを維持し、必要に応じてユーザ入力を読み取ることによってそれを満たす。バッファが空になり、プログラムによってさらに多くのデータが要求された場合、ドライバはプログラムにデータを追加する前に入力行全体を読み込みます。したがって、バッファが空の場合、getcでも1文字を読み取ると、getcが返される前に、端末ドライバのバッファに全体が読み込まれます。

ドライバが入力文字を読み取るときに、特定の特殊文字がないかどうかをチェックします。何か他のものがラインバッファに加えられ、端末装置にエコーされる。 (端末装置への入力と出力は独立しているので、ドライバやプログラムが入力をエコーし​​なかった場合は画面上に何も表示されないので、通常混乱します。例)

すべての特殊文字は設定可能です。かなりの数があります。ここでは、より一般的なもののいくつかされています

  • バッファに改行文字挿入を入力し、保留中の読み取りが返すように入力行を終了します。
  • Ctrl-DEOF)文字自体は破棄されますが、入力が終了し、保留中の読込みが返されます。入力バッファが空の場合(Ctrl-Dがラインの先頭で押された場合)、ゼロ長のバッファが保留中の読み込みに返され、ファイルマーカーの終わりとして解釈されます。
  • BkspERASE)入力バッファが空でない限り、入力バッファから最後の文字を削除し、画面から消去します。
  • Ctrl-CINTRSIGINTをプロセスに送信します。
  • Ctrl-ZSUSPSIGTSTPをプロセスに送信します。
  • Ctrl-UKILL)入力バッファ全体を削除します。
  • Ctrl-SSTOP)出力を停止します。
  • Ctrl-QSTARTSTOP文字で停止した場合は出力を再開します。

Linuxの端末ドライバは文字をエコーされた場合、それは通常、エコー制御文字(ASCIIコードが0x20の未満である文字)は、そのコード0x40の高い文字が続くキャレット(^)とし、これ通常は手紙です。 ESC文字にはコード0x1Bが含まれているため、通常はキャレットとしてエコーされ、その後に0x5Bという文字が続きます。これは角カッコが開きます。したがって、通常、ESC^[とエコーされます。キーボード上の

多くのキーは、実際には複数の文字を送信し、ほぼすべてのこれらの配列のは、[ESCで始まります。上矢印は、例えば、コードESC[を送り、そしてあなたは、カーソルの移動文字を処理しない素朴なプログラムを実行している場合ので、あなたは上矢印キーを押したときに^[[Aがエコー表示されます。

表示される文字は、Unicodeグリフに対応しない文字を表示する方法の1つです。このボックスには、Unicodeコードポイントに対応する4桁の16進数(この場合U + 001B、ESC文字)が含まれています。なぜこのようなことが起こったのか分かりませんが、ターミナルエコーに寄与するさまざまなコンポーネント間の競合状態の結果である可能性が最も高いです。

関連する問題