重複の可能性:
Cコードの前の行に移動する方法
\n
最後を削除したい
for(i = 0; i < 10; i++)
printf("****\n");
これでは\b
うまくいかないようです。私は何をすべきか?
重複の可能性:
Cコードの前の行に移動する方法
\n
最後を削除したい
for(i = 0; i < 10; i++)
printf("****\n");
これでは\b
うまくいかないようです。私は何をすべきか?
最善の解決策は、それをまったく印刷しないことです。
for(i = 0; i < 10; i++) printf("****%s", ((i!=9)?"\n":""));
または、2つのprintfsを使用します(同じ効果がありますが、コードが少し増えて読みやすくなります)。
for(i = 0; i < 10; i++) {
printf("****");
if (i != 9 ) {
printf("\n");
}
}
printf("****");
for(i = 0; i < 9; i++)
printf("\n****");
これは基本的にIvayloが出した答えと同じですが、各反復の条件をチェックする代わりに、それを完全に移動することができます。
for(i = 0; i < 9; i++)
printf("****\n");
printf("****");
さて、そのようなマイクロ最適化が必要かどうかは別の問題です。
C標準で定義されている、カーソルを1行上(または前のテキストバッファ)に移動するカーソル位置の文字シーケンスはありません。したがって、これを行うための100%ポータブルな方法はありません。
ただし、プラットフォームによっては、ほとんどの端末コンソールがANSIエスケープコードをサポートしています。この場合、次のようなことができます。
for(i = 0; i < 10; i++)
printf("****\n");
printf("\033[A\033[C\033[C\033[C\033[C");
これは、エスケープシーケンスを使用して、カーソルを1行上に移動し(\033[A
)、続いて1文字前に移動し(\033[C
)、4回実行して4つのアスタリスクを超えて移動します。したがって、改行上を「後方」に移動する効果が得られます。
#define
少しすっきりした意味で、これを:に入れることができます。
#define BACKUP_NEWLINE "\033[A\033[C\033[C\033[C\033[C"
for(i = 0; i < 10; i++)
printf("****\n");
printf("%s", BACKUP_NEWLINE);
より良い解決策(少なくともハードコーディングが少ない)は、Windowsでcursesライブラリまたは同等のものを使用することです。
これを行うための明確に定義されたポータブルな方法はありません。標準で示されているように、現在の行の文字のみを変更できます。
\b
(backspace)アクティブな位置を現在の行の前の位置に移動します。アクティブな位置がラインの初期位置にある場合、ディスプレイデバイスの動作は指定されていません。
他の答えは、あなたが必要とすることをするための異なる方法をすでに証明しました。
別の方法:
以下のコードを使用できます:-)
int t;
for(i = 0; i < 10; i++)
t=printf("****\n"); // t would hold number of characters printed.
printf("\033M\033[%dC",t-1);
2つのエスケープ文字を使用します。
printfに\n、\ tなどの他の空白文字が含まれている場合は、水平カーソル位置を見つけるために、何らかのロジックを使用して計算する必要があります。
別の方法は次のとおりです。
for(i = 0; i < 10; i++)
printf("****\033[s\n"); // \033[s would save column number
printf("\033M\033[u");
ANSIエスケープ文字の詳細はこちら:-)