0

重複の可能性:
Cコードの前の行に移動する方法

\n最後を削除したい

for(i = 0; i < 10; i++)
     printf("****\n");

これでは\bうまくいかないようです。私は何をすべきか?

4

6 に答える 6

8

最善の解決策は、それをまったく印刷しないことです。

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");
  }
}
于 2013-01-18T12:33:09.847 に答える
2
printf("****");
for(i = 0; i < 9; i++)
     printf("\n****");
于 2013-01-18T12:36:51.707 に答える
1

これは基本的にIvayloが出した答えと同じですが、各反復の条件をチェックする代わりに、それを完全に移動することができます。

for(i = 0; i < 9; i++)
    printf("****\n");

printf("****");

さて、そのようなマイクロ最適化が必要かどうかは別の問題です。

于 2013-01-18T12:37:49.367 に答える
1

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ライブラリまたは同等のものを使用することです。

于 2013-01-18T13:33:47.013 に答える
0

これを行うための明確に定義されたポータブルな方法はありません。標準で示されているように、現在の行の文字のみを変更できます。

\bbackspace)アクティブな位置を現在の行の前の位置に移動します。アクティブな位置がラインの初期位置にある場合、ディスプレイデバイスの動作は指定されていません。

他の答えは、あなたが必要とすることをするための異なる方法をすでに証明しました。

于 2013-01-18T12:38:54.403 に答える
0

別の方法:

  1. ANSI準拠の端末を使用している場合、&
  2. printfは、''(スペース)以外の空白文字を使用しません(例:\ t、\ n、\ vなど)。

以下のコードを使用できます:-)

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つのエスケープ文字を使用します。

  1. <ESC> M:前の行に移動しますが、最初の列
  2. <ESC> [<num> -C:<num>の場所を右に移動します。

printfに\n、\ tなどの他の空白文字が含まれている場合は、水平カーソル位置を見つけるために、何らかのロジックを使用して計算する必要があります。

別の方法は次のとおりです。

for(i = 0; i < 10; i++)
   printf("****\033[s\n");      // \033[s would save column number
printf("\033M\033[u");

ANSIエスケープ文字の詳細はこちら:-)

于 2013-01-18T13:10:18.957 に答える