1

キャリッジリターンには本当に奇妙な問題があります。行を複数回書き直そうとしましたが、行にスペースがなければ正常に機能し、スペースがあれば機能しません。たとえば、このコード

printf("                                                                          ");
printf("\rtest test");
printf("                                                                          ");
printf("\rtest test");
printf("                                                                          ");
printf("\rtest test");
printf("                                                                          ");
printf("\rtest test");

このコード中に4行の「テストテスト」と入力します

printf("                                                                          ");
printf("\rtest");
printf("                                                                          ");
printf("\rtest");
printf("                                                                          ");
printf("\rtest");
printf("                                                                          ");
printf("\rtest");

単一行の「test」と入力します。何が問題ですか?スペースがあるかどうかに関係なく、行を無視して書き直すことができるようにしたい。

4

2 に答える 2

8

\rカーソルを tty の物理行の先頭に移動します。前の出力でカーソルが次の行に折り返される場合 (つまり、スペースの数 + 「テキスト テキスト」の文字数がディスプレイの幅より大きい)、カーソルは次の物理行にあります。目的を達成するには、より複雑なエスケープ シーケンスを使用する必要があります。(つまり、カーソル位置を保存/復元します。) 例として (これは移植性がありませんが、多くの場合に機能します)、次のように実行できます。

fputs( "\0337", stdout );  /* Save the cursor position */
printf( " ... " );
fputs( "\0338", stdout );  /* restore cursor position */

カーソルが画面の下部にある場合、これはおそらく意図したとおりに実行されないことに注意してください。位置は画面の下部に保存され、複数行の出力がスクロールされ、カーソルが画面の下部に復元されます。

于 2013-01-07T13:56:35.680 に答える
0

新しい行に印刷するには、キャリッジ リターンではなく改行 ('\n') を使用します。

コンソールでの '\r' の動作は、現在の行の先頭に戻ることです。この場合、最初に改行を強制していたのは大量のスペース パディングです。

場合によっては、CR を CR+LF に変換するように端末を構成できます。厳密には「\n」は先頭に戻らずに 1 行下に移動する単なる LF 文字ですが、stdout の通常の動作はそれを CR+LF に変換することです。

于 2013-01-07T14:21:46.517 に答える