2017-01-25 7 views
-1

私はターミナルとの対話を可能にする必要があるCのプログラムに取り組んでいます。バックスペースキーを正しく動作させるために数日試してみました。VT100エスケープコードCから奇妙な行動カーソルを移動するプログラム

私のプログラムでは、端末からの入力をポーリングします。私は入力を検出すると、私はキーが押されたかどうかを確認することにより、バックスペースました:

if((letter == 8 || letter == 127) && cursorPosition >= 1) 

cursorPositionは、端末上のカーソルの現在位置を保持しています。私は、ユーザーが私のプロンプトを削除することを許可されていないことを確認するためにこのチェックを行います。これは>です。

チェックに合格後はその後、私は戻ってカーソルを移動し、文字を削除するには、次のコードを使用します。このコードは、私はOSの一部であるため

serial_print("\033[1D"); 
serial_print("\033[K"); 

serial_printは私で定義された関数でありますqemuで書く、走る。私はc printfにアクセスすることができないので、端末への入出力にシリアルポートを使用しています。この関数はすでに正しく動作することがわかっています。

私の思考プロセスは、最初の行はカーソルを1列左に移動し、2行目はカーソルの右側にあるすべてを消去するということです。

ターミナルの行に3文字以上の文字が入力されるまでは問題ありません。

私は1つの文字がある場合: 1 をして、バックスペースキーを押し、私が手:

2つの文字が入力されたとき、私も正常に動作します。私は3つの文字がある場合はしかし、:バックスペースを6回押した後123456 ::私は6つの文字を持っている場合は 123

:その後、 123 をし、バックスペース3回押し、これはラインがどのように見えるかです123456454

ターミナルがエスケープシーケンスを解釈する方法は、現在どのくらいの文字が行にあるかに基づいて変化しているようですので、私は混乱しています。私はMacのVirtualBoxでUbuntu 16.04を実行していて、qemuを使ってOSを実行しています。その情報があれば、Ubuntu端末に書いています。

これを引き起こした原因は何ですか?また、私はまだここにそれのハングを取得しているので、あなたが多くの情報が必要な場合、または私は間違って何かをした、私に知らせてください。

+0

バッファの保存/印刷コードは何ですか?つまり、あなたは画面を正しく操作していますが、ストレージバッファではありませんか? – usr2564301

+1

問題を示す(短い)プログラムがなければ、何もコメントすることはありません。 –

答えて

0

'cursorPosition'に問題がある可能性があります。これを試してみてください:

if (letter == 8 || letter == 127) { 
    if (cursorPosition >= 1) { 
     serial_print("\033[1D"); 
     serial_print("\033[K"); 
     --cursorPosition; 
    } 
} else if (letter >= 32 && letter <= 126) { 
    serial_print_char (letter); 
    ++cursorPosition; 
}