1

端末画面をときどきクリアする必要がある小さなコンソール プログラムを作成しました。*nix システム上/用のコードを書き、system("clear")これらのインスタンスで使用しました。コードが完成したら、コードの移植性を評価するためにレビューしました。画面をクリアする上記の方法は、私の唯一の明らかな移植性の問題でした。次に、端末をクリアするための他の可能な方法を探したところANSI Cursor Indexing、具体的には次のドキュメントが見つかりました。

void cls() {
  //27 is ESC ASCII char
  printf("%c[2J",27);   //clears screen
  printf("%c[0;0H",27); //sets cursor at [0,0]
}

驚いたことに、このコードは私の *nix システムで見事に機能しました。この ANSI Cursor Indexing Scheme は移植可能ですか? このコードは、C 標準コンパイラを使用するすべてのシステムでコンパイルされ、期待どおりに動作しますか?」

4

2 に答える 2

2

このようなクロスプラットフォームのターミナル操作には、ncursespdcursesをお勧めします:

#include <curses.h>

// Init curses somewhere before in your code
initscr();

void cls() {
    clear();
    move(0, 0);
}
于 2013-02-10T20:17:15.190 に答える
2

ANSI と VT100 のエスケープ シーケンスは非常に似ています。つまり、端末がこれら 2 つのいずれかであれば、上記の一連のコマンドは確実に機能します。ただし、ANSI は VT100 のスーパーセットであるため、VT100 互換端末はすべての ANSI シーケンスを理解できるわけではないことに注意してください。

VT100 ターミナル エミュレータは、絶対に最も一般的なものの 1 つです (xterm およびその他の「X-windows スタイル シェル」のデフォルトを含む)。

明らかに、Volker-Craig 404 ターミナル エミュレーター [誰か使っている人はいますか? ;)] ANSI または VT100 エスケープ シーケンス、または実際にはすべてのエスケープ シーケンスを理解できません。

ESC を定数文字列に組み込むことで、コードがより簡単になることも指摘します。

printf("\033[2J");

または、もう少し読みやすくしたい場合:

#define ESC_STR "\033"

printf(ESC_STR"[2J");
于 2013-02-10T20:19:38.127 に答える