Warum setzen die Leute '\ n' am Anfang von Strings?


8

Sehr oft komme ich in C-Code, wo printfFormatzeichenfolgen beginnen mit \n:

printf ("\ nHallo");

Dies ist meiner Meinung nach eine nervige Sache, die keine Vorteile (ziemlich viele Nachteile!) In Bezug auf das Drucken bietet "Hello\n":

  • Wenn die erste gedruckte Zeile mit beginnt '\n', beginnt die Programmausgabe mit einer (unbrauchbaren) leeren Zeile
  • Wenn die letzte gedruckte Zeile nicht mit endet, endet die '\n'Programmausgabe nicht mit einer neuen Zeile (nützlich beim Lesen der Ausgabe auf einem Terminal).
  • Auf den meisten Terminals (in leitungsgepufferten Streams im Allgemeinen) wird die Ausgabe geleert, wenn a '\n'angetroffen wird, sodass eine Zeile, die nicht mit endet '\n', viel Zeit nach dem tatsächlichen Löschen auf dem Bildschirm angezeigt werden kann printf(oder vielleicht nie, wenn der Stream nie geleert wird) zum Beispiel, wenn das Programm abstürzt)

Warum mögen die Leute das?


2
Das ist eine kleine Sache, die mich wirklich nervt. Leute, die cout << endl << .. tun; macht mich auch verrückt. Ich weiß, es gibt keinen Unterschied, aber ...
Vitor Py

Meinen Sie "Flushing" im Sinne von "New Line" oder wie in fflush ()?
LennyProgrammers

@ Lenny222: im Sinne von fflush().
Peoro

1
Ah, ich habe nicht bemerkt, dass printf () im Gegensatz zu C ++ - Streams in Zeilenumbrüchen leert.
LennyProgrammers

Weil sie falsch sind. Es ist im Allgemeinen ein Neuling Fehler
Basile Starynkevitch

Antworten:


16

Im Allgemeinen wird sichergestellt, dass die Anweisung in der nächsten Zeile gedruckt wird. Wenn dies am Ende der Zeile erfolgt, kann der gleiche Effekt abgeleitet werden. Es ist wirklich von geringer Bedeutung.

Update : Solange Sie einen Weg wählen und dabei bleiben, wird es wirklich keine Rolle spielen. Wenn Sie wirklich besorgt sind, geben Sie alle Ihre Anweisungen als "\ nHallo \ n" ein. Wenn Sie einige Zeilen zusammenfügen, ist dies wirklich nicht so schwer zu beheben. Gehen Sie einfach zurück und ändern Sie die beleidigende Aussage.


14
Der Unterschied besteht darin, dass Sie am Anfang der Zeile garantieren, dass es in einer neuen Zeile gedruckt wird. Wenn Sie an einer großen Codebasis arbeiten, wird möglicherweise eine Zeile vor Ihrer ausgedruckt, an die keine neue Zeile angehängt ist.
Robert Anton Reese

1
Dies gilt insbesondere dann, wenn Sie zu Debugging-Zwecken gedruckte Anweisungen verwenden.
Peter Rowell

2
Ok, aber auf diese Weise könnte eine neue Nachricht ( "Hello2\n") in derselben Zeile wie Ihre letzte landen (endet in "\nHelloHello2\n"): Ist das nicht so schlimm wie Ihre message on the same line of the previous one (eg: "\nPrevious-messageHello\n")? Wenn diese beiden Szenarien auf die gleiche Weise schlecht sind, sollte ein Programmierer / Projekt einen Standard übernehmen (z. B. immer '\n'am Anfang oder am Ende setzen), aber ich kann nicht erkennen, welche Vorteile Sie durch das Setzen '\n'am Anfang haben könnten Ihrer Nachrichten ...
Peoro

@peoro, ich denke mein Update sollte eine Lösung bieten, wenn es dich wirklich stört.
Morgan Herlocker

5

Zwei Wörter: persönliche Präferenz. Nach dem großen Schema der Dinge denke ich nicht, dass dies wirklich wichtig ist. Wenn Sie sich darüber ärgern, fragen Sie den Autor dieses Codes, warum er so geschrieben wird. Möglicherweise erhalten Sie einige interessante Antworten.

Ich bevorzuge sowieso alle meine Zeilenumbrüche am Ende jeder Zeile.


+1 - Es ist alles Präferenz. Ich bevorzuge meine Newline auch am Ende der Saite, weil es mir natürlicher erscheint
Jetti

Wenn ich persönlich genug Ausgabe habe, um dies zu berücksichtigen, versuche ich, alle tatsächlichen printfs, couts und newlines in einer einzigen Funktion (möglicherweise in main ()) zu halten, damit ich dumme Fehler im Zusammenhang mit fehlenden / zusätzlichen Zeilenumbrüchen vermeiden kann . Aber vielleicht bin ich nur OCD über sie.
Ixrec

4

Als jemand, der diese Redewendung in einigen Kontexten verwendet - obwohl ich im Allgemeinen \nam Ende setze , um das Löschen sicherzustellen -, kann ich eine Rechtfertigung anbieten: Ich neige dazu, dies beim Formatieren vieler Zeilen zu verwenden, insbesondere wenn ich mit einer leeren Zeile beginne, so dass das \ns Sind ausgerichtet. Dies bedeutet, dass es etwas einfacher ist, (a) zu überprüfen, ob alle Zeilen tatsächlich a \noder (b) enthalten, sie als Ballast zu ignorieren, und einfach den Text in den Zeilen zu lesen. In dieser Situation sieht es für mich auch ordentlicher aus, aber ich finde all diese Vorteile gering.

Ein alternativer Ansatz zur Minimierung von syntaktischem Ballast besteht darin, Zeichenfolgenliterale einschließlich neuer Zeilen zu verwenden. 6.4.5 im C11-Standard verbietet diese jedoch. Sie müssen daher gut mit Ihrem Compiler sprechen und sorgfältig überlegen, was er tun wird.


3

Ein Grund, der nicht erwähnt wird (es sei denn, ich habe ihn verpasst), ist, dass einige CLI-Programme '\ r' verwenden, um eine Zeile wiederholt zu aktualisieren. Zum Beispiel mit Status.

Die nächste Zeile erfordert eine neue Zeile, um den Cursor auf die nächste (neue) Zeile zu bringen.

Ein anderes (sehr schlechtes) Beispiel ist, wenn der Programmierer weiß, dass möglicherweise mehrere Programme auf dasselbe Terminal schreiben. In diesem chaotischen Fall besteht die Möglichkeit, dass das führende '\ n' einen gepufferten Text ausspült, bevor mehr geschrieben und möglicherweise die Ausgaben von Schreibvorgängen verschlüsselt werden. Eine solche Bestellung ist jedoch nicht garantiert, und früher oder später wird der andere Prozess einbrechen und die Dinge ruinieren. Mach das nicht mit irgendetwas, das du deiner Mutter zeigen willst!

Ich würde versuchen, das obige Beispiel für Debugging-Zwecke beizubehalten und andere Benutzer als Sie nicht den Ergebnissen auszusetzen. Dies würde auch für mehrere nicht synchronisierte Aufgaben gelten, die in dieselbe (hoffentlich debuggende) Datei schreiben.

Der Fall, dass '\ r' zum Überschreiben einer Textzeile auf dem Bildschirm verwendet wird, ist in der CLI-Welt jedoch nicht so selten.

Es passiert schließlich etwas.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.