なぜ人々は文字列の先頭に「\ n」を置くのですか?


8

非常に頻繁に、printfフォーマット文字列が始まるCコードに入ります\n

printf( "\ nHello");

私の意見では、これは印刷に関して利点がない(むしろ多くの欠点がある)迷惑なものです"Hello\n"

  • 印刷された最初の行がで始まる場合'\n'、プログラム出力は(役に立たない)空の行で始まります
  • 最後に印刷された行がで終わっていない場合'\n'、プログラム出力は新しい行で終わりません(端末で出力を読み取るときに役立ちます)。
  • ほとんどの端末(一般的にはラインバッファーストリーム)では、が検出されると出力がフラッシュされる'\n'ため、'\n'実際に終了してからprintf(または、ストリームがフラッシュされない場合は、おそらく)で終了しない行が画面に表示される可能性があります。 、たとえばプログラムがクラッシュした場合)

それで、なぜ人々はこれを好きですか?


2
これは本当に私を困らせる小さなことです。cout << endl << ..;を行う人々また私を怒らせます。違いはないのですが...
Vitor Py

「フラッシュ」は「新しい行」という意味ですか、それともfflush()のようですか?
LennyProgrammers

@ Lenny222:の意味でfflush()
peoro

1
ああ、C ++ストリームとは対照的に、printf()は改行でフラッシュすることに気付いていません。
LennyProgrammers

彼らは間違っているからです。それは一般的に初心者の間違いです
バジル・スタリンケビッチ

回答:


16

通常、ステートメントが次の行に出力されるようにするために行われます。行末で行うと同じ効果が得られます。それは本当にほとんど重要ではありません。

更新:1つの方法を選択してそれを使い続ける限り、実際には少しでも問題ありません。本当に心配な場合は、すべてのステートメントを「\ nHello \ n」と入力してください。いくつかの行をつなぎ合わせている場合、これは実際に修正する「バグ」のそれほど難しくありません。戻って問題のステートメントを変更してください。


14
違いは、行の先頭に配置すると、新しい行に出力されることを保証することです。大きなコードベースで作業している場合、前に改行が追加されていない行が出力されることがあります。
Robert Anton Reese

1
これは、デバッグ目的でprintステートメントを使い続ける場合に特に当てはまります。
Peter Rowell、2011年

2
わかりましたが、このようにすると、新しいメッセージ("Hello2\n")が最後のメッセージと同じ行に(最終的に)になる可能性が"\nHelloHello2\n"ありますmessage on the same line of the previous one (eg: "\nPrevious-messageHello\n"。これら2つのシナリオが同じように悪い場合、プログラマー/プロジェクトは標準を採用する必要があります(例:常に'\n'最初または最後に置く)'\n'が、最初に置くことでどのような利点があるかわかりませんメッセージの...
peoro

@peoro、本当に気になる場合は、私のアップデートで解決策が見つかると思います。
Morgan Herlocker、2011年

5

2つの言葉:個人的な好み。物事の壮大な計画では、これは本当に重要だとは思いません。あなたがそれに悩まされているなら、なぜこのように書くのか、このコードの作者に尋ねてください。あなたはいくつかの興味深い答えを得るかもしれません。

とにかく、各行の終わりにあるすべての改行文字を好みます。


+1-すべての設定です。それは私にはより自然に思えるので、私は同様に、文字列の最後に私の改行を好む
Jetti

個人的には、これが問題になるのに十分な出力がある場合、実際のprintf、couts、および改行をすべて単一の関数(おそらくmain()で)に保持することで、欠落した/余分な改行に関連する愚かなバグを防ぐことができます。しかし、多分私はそれらについてただのOCDです。
Ixrec 2015年

4

一部のコンテキストでこのイディオムを使用する人として、私は通常\n、最後にフラッシュを確実にするために置きますが、正当な理由を提供できます。特に、空行で始まる場合、これを使用して多くの行をフォーマットする傾向があるため、\ns揃えられます。つまり、(a)すべての行に実際にaが含まれていることを確認し\nたり、(b)バラストとして無視したり、行のテキストを読んだりする方が簡単です。この状況では、実際には私にも見栄えがしますが、これらの利点はすべてマイナーです。

構文バラストを最小化する別のアプローチは、改行を含む文字列リテラルを使用することですが、C11標準の 6.4.5ではそれらを禁止しているため、コンパイラーと適切に話し、コンパイラーが何をするかについて慎重に検討する必要があります。


3

(見逃さない限り)言及されていない理由は、一部のCLIプログラムが '\ r'を使用して行を繰り返し更新するためです。たとえば、ステータス付き。

次の行では、カーソルを次の(新しい)行に移動するために改行が必要です。

別の(非常に悪い)例は、プログラマーが複数のプログラムが同じ端末に書き込んでいる可能性があることを認識している場合です。この無秩序なケースでは、先行する「\ n」が追加の書き込みの前にバッファリングされたテキストをフラッシュし、場合によっては書き込みの出力をスクランブルすることによって、何らかの順序が課される可能性があります。しかし、そのような順序は保証されておらず、遅かれ早かれ、他のプロセスが介入して物事を台無しにしてしまいます。お母さんに自慢したいことにはこれをしないでください!

上記の例はデバッグ目的で使用し、自分以外のユーザーに結果を知らせないようにします。これは、同じ(できればデバッグ)ファイルに書き込む複数の非同期タスクにも当てはまります。

ただし、 '\ r'を使用して画面上のテキスト行を上書きするケースは、CLIの世界では珍しくありません。

結局のところ、何かが起こります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.