C に \n の代わりはありますか? \n を使わずに次の行にジャンプできますか? 私はこの質問に出くわしましたが、方法を理解できないようです..
#include < stdio.h>
void main()
{
printf("A");
printf("B");
}
印刷してほしい
A
B
そしてそうではない
AB
しかし、\n は使用できません。
\n
書き込みなしで出力\n
するには、単にprintf("%c",10);
、またはchar c=10;write(1,&c,1);
、または ascii 10 を出力する 100 の他の方法が可能です。
ただし、改行文字を完全に避けたい場合は、答えが異なります。実際に新しい行に移動することを決定するのはCまたはコードではなく、出力を表示するデバイスが何であれ.
たとえば、ターミナル、ライン プリンター、または html を表示する Web ブラウザーなどです。
ブラウザに出力すると仮定すると、答えは <br> になります。
xterm 端末に出力している場合、\033[1B はカーソルを 1 行下に移動します。行の先頭に移動するには、キャリッジ リターン \r を出力します。
たとえば、次のようになります。
printf("test\033[1B\r123");
出力します(xtermで)
test
123
\n
「改行」を意味します。\r
「キャリッジリターン」を意味します。これらの文字は、用紙を新しい行に進めるためと、プリント ヘッドを搭載したキャリッジを行の先頭に戻すための両方を必要とする古いフォーム フィード プリンターに由来します。
異なる OS では、2 つの異なる組み合わせを使用して、テキスト内の改行を示しています。
\n
\r\n
\r
C 標準ライブラリには、「システム」の改行/キャリッジ リターン文字を表す正規のプラットフォームに依存しない方法はありません。ただし、他の多くの言語やライブラリがこれを実装しています。
System.getProperty("line.separator")
System.Environment.NewLine
ただし、テキスト ファイルで開いている出力ストリームがある場合、標準 C ライブラリは\n
、現在のシステムで新しい行を示すために必要なものに変換する必要があります。
の代わりに、 :puts()
に相当する 8 進数を使用できます。\n
\012
例えば
#include <stdio.h>
int main()
{
printf("A\012");
printf("B\012");
return 0;
}
私は単に使用します:
printf("A%cB",10);
Cでは、エスケープ シーケンスは、基本実行文字セット \n
に属する文字を表します。
特に、C プログラムの実行中に改行文字が存在することを確認できます。
さらに重要:\n
は 1 文字のみにマップされ、そのコードは type の範囲内の正の整数char
です。
ただし、表示デバイスの動作によって、別の結果が生じる場合があります。
たとえば、\n
Windows でテキスト ファイルに文字を送信すると、これは 2 つの文字 \x0D\x0A (LF+CR、つまり、ライン フィード + キャリッジ リターン) のシーケンスに置き換えられます。
標準の C99 または C11 は次のように述べています。
(5.2.2) \n (改行) アクティブな位置を次の行の最初の位置に移動します。
その意味は (標準の表示装置に数行を出力するすべてのシステムで)、文字を送ることの「効果」\n
は「次の行に進む」および「その行の先頭に行く」ことです。「改行」と「改行」の合計です。
DOS/Windows では、これは '\xD'、'\xA' の 2 文字のシーケンスを送信することと同じです。
Linux/Unix では、これは文字 '\xD' のみを送信することと同じです。
詳細はこちら: http://en.wikipedia.org/wiki/Newline
要約すると、文字\n
自体と、\n
C で制御文字と見なされる場合に 関連するセマンティックを区別する必要があります。
またはを使用して文字'\n'
を送信するだけで、改行を「生成」できます。
使用することは、それを行うためのより良い方法です。 putc()
printf()
\n
別の非常に優れた代替手段は、@1'': 関数 puts(str) を使用することで指摘されています。
この関数は、文字列 str の末尾に改行を追加します。
この他の選択肢を試すのはまったく良い考えではないと思います:
printf("%c", 10); // 10 == 0x0A
printf("%c", 13); // 10 == 0x0D
printf("\x0A"); // CR
printf("\x0D"); // LF
プログラムがシステムに依存するようになるため、問題を適切に解決していません。
Windows、Linux、または何に有効ですか?
最悪: 理論的には、標準Cでは、文字の ASCII/Unicode コード番号と、プログラムが実行されるシステムで使用される文字との間の対応さえ保証されていません。この問題は、制御文字にも関係しています。
したがって、0x10 が「キャリッジ リターン」を意味し、0x13 が「改行」を意味することを確認することはできません。
それを確認するには、次のマクロの存在を確認する必要があります。
__STDC_ISO_10646__
(そのマクロが存在する場合は、long int
コンパイラでサポートされている Unicode のバージョンに関する情報を含む番号です。)
重要なことは、マクロ__STDC_ISO_10646__
が定義されていない場合、システム内の文字に割り当てられたコードについて確実性が得られないということです。
したがって、「マジックナンバー」10と13は使用できません。