Was ist der Unterschied zwischen \n
(Zeilenumbruch) und \r
(Wagenrücklauf)?
Gibt es insbesondere irgendwelche praktisch Unterschiede zwischen \n
y \r
? Gibt es Stellen, an denen die eine statt der anderen verwendet werden sollte?
Was ist der Unterschied zwischen \n
(Zeilenumbruch) und \r
(Wagenrücklauf)?
Gibt es insbesondere irgendwelche praktisch Unterschiede zwischen \n
y \r
? Gibt es Stellen, an denen die eine statt der anderen verwendet werden sollte?
Zum Ausfüllen,
In einem Shell-Skript (bash) können Sie Folgendes verwenden \r
Cursor zu senden, vorne auf der Linie und natürlich \n
um den Cursor in eine neue Zeile zu setzen.
Versuchen Sie zum Beispiel :
echo -en "AA--AA" ; echo -en "BB" ; echo -en "\rBB"
AA--AA
AA--AABB
BB--AABB
Aber vergessen Sie nicht, die -en
als Parameter.
Unter Windows wird die \n
springt an den Anfang der nächsten Zeile. Die \r
springt an den Anfang der aktuellen Zeile, ohne in die nächste Zeile zu springen. Ich habe verwendet \r
in meinen eigenen Konsolenanwendungen, in denen ich Code teste und nicht möchte, dass der Text auf dem Bildschirm nach oben scrollt, so dass ich stattdessen \n
nach dem Ausdrucken eines Textes, z. B. einer Bildrate (FPS), werde ich printf("%-10d\r", fps);
Dadurch kehrt der Cursor an den Anfang der Zeile zurück, ohne in die nächste Zeile zu springen, und ich kann andere Informationen auf dem Bildschirm anzeigen, die nicht weggescrollt werden, während die Framerate in derselben Zeile ständig aktualisiert wird (die %-10
stellt sicher, dass die Ausgabe mindestens 10 Zeichen lang ist, linksbündig, so dass sie mit Leerzeichen aufgefüllt wird und alle alten Werte für diese Zeile überschreibt). Es ist ziemlich praktisch für Sachen wie diese, in der Regel, wenn ich Debugging Zeug Ausgabe auf meiner Konsole Bildschirm haben.
Eine kleine Geschichte
El /r
steht für return o Wagenrücklauf die ihre Geschichte der Schreibmaschine verdankt. Ein Wagenrücklauf bewegte den Wagen ganz nach rechts, so dass man am Anfang der Zeile tippte.
El /n
steht für neue Linie Auch hier gilt, dass man seit der Zeit der Schreibmaschine in eine neue Zeile wechselt. Allerdings nicht unbedingt zum Anfang der Zeile, weshalb einige Betriebssysteme die Notwendigkeit sowohl einer /r
zurück, gefolgt von einer /n
Zeilenumbruch, da dies die Reihenfolge war, in der eine Schreibmaschine dies tat. Das erklärt auch die alten 8-Bit-Computer, die früher mit Rückkehr statt Eingabe , von Wagenrücklauf das war bekannt.
Im Zusammenhang mit der Bildschirmausgabe:
Zum Beispiel:
Hallo, \nworld\r !
soll auf Ihrem Terminal als dargestellt werden:
Hello,
! world
Einige Betriebssysteme können die Kompatibilität mit dem beabsichtigten Verhalten aufheben, aber das ändert nichts an der Antwort auf die Frage "Unterschied zwischen \n y \r ?".
Was ist der Unterschied zwischen \n (Zeilenumbruch) und \r (Wagenrücklauf)?
Gibt es insbesondere irgendwelche praktischen Unterschiede zwischen
\n
y\r
? Gibt es Stellen, an denen die eine statt der anderen verwendet werden sollte?
Ich möchte ein kurzes Experiment mit den jeweiligen Escape-Sequenzen von \n
für Zeilenumbruch und \r
für Wagenrücklauf, um zu verdeutlichen, wo der deutliche Unterschied zwischen ihnen liegt.
Ich weiß, dass diese Frage als sprachunabhängig gestellt wurde. Trotzdem brauchen wir zumindest eine Sprache, um das Experiment durchführen zu können. In meinem Fall habe ich C++ gewählt, aber das Experiment soll generell in jeder Programmiersprache anwendbar sein.
Das Programm wiederholt sich einfach, um einen Satz in die Konsole zu drucken, was durch eine for-Schleife geschieht.
Newline-Programm:
#include <iostream>
int main(void)
{
for(int i = 0; i < 7; i++)
{
std::cout << i + 1 <<".Walkthrough of the for-loop \n"; // Notice `\n` at the end.
}
return 0;
}
Ausgabe:
1.Walkthrough of the for-loop
2.Walkthrough of the for-loop
3.Walkthrough of the for-loop
4.Walkthrough of the for-loop
5.Walkthrough of the for-loop
6.Walkthrough of the for-loop
7.Walkthrough of the for-loop
Beachten Sie, dass dieses Ergebnis nicht auf cualquier System, führen Sie diesen C++-Code aus. Er sollte aber auf den meisten modernen Systemen funktionieren. Lesen Sie unten für weitere Details.
Nun das gleiche Programm, aber mit dem Unterschied, dass \n
wird ersetzt durch \r
am Ende der Drucksequenz.
Programm für den Wagenrücklauf:
#include <iostream>
int main(void)
{
for(int i = 0; i < 7; i++)
{
std::cout << i + 1 <<".Walkthrough of the for-loop \r"; // Notice `\r` at the end.
}
return 0;
}
Ausgabe:
7.Walkthrough of the for-loop
Haben Sie bemerkt, wo der Unterschied liegt? Der Unterschied besteht einfach darin, dass bei Verwendung der Escape-Sequenz Carriage Return \r
am Ende jeder Drucksequenz wird die nächste Iteration dieser Sequenz nicht in die nächste Textzeile gesetzt - Am Ende jeder Drucksequenz ist der Cursor nicht an den *Anfang der nächsten Zeile gesprungen.
Stattdessen sprang der Cursor an den Anfang der Zeile zurück, an deren Ende er sich befand, bevor er die \r
Charakter. - Das Ergebnis ist, dass jede folgende Iteration der Drucksequenz die vorherige ersetzt.
*Anmerkung: A \n
springen nicht unbedingt an den Anfang der folgenden Textzeile. Auf einigen, in der Regel älteren, Betriebssystemen wird das Ergebnis der \n
Newline-Zeichen sein kann, dass es an eine beliebige Stelle in der folgenden Zeile springt, nicht nur an den Anfang. Aus diesem Grund müssen sie \r \n
um an den Anfang der nächsten Textzeile zu gelangen.
Dieses Experiment hat uns den Unterschied zwischen Zeilenumbruch und Wagenrücklauf im Zusammenhang mit dem sortie der Iteration einer Drucksequenz.
Bei der Diskussion über die Eingabe in einem Programm können einige Terminals/Konsolen einen Wagenrücklauf aus Gründen der besseren Portabilität, Kompatibilität und Integrität implizit in einen Zeilenumbruch umwandeln.
Wenn Sie aber die Wahl haben, eine für eine andere zu wählen oder explizit nur eine bestimmte verwenden wollen oder müssen, sollten Sie immer mit derjenigen arbeiten, die zu ihrem Zweck passt und strikt dazwischen unterscheiden.
Um die Verwirrung noch zu vergrößern, habe ich an einem einfachen Texteditor gearbeitet, der ein TextArea-Element in einer HTML-Seite in einem Browser verwendet. In Erwartung von Kompatibilitätsproblemen in Bezug auf CR/LF habe ich den Code so geschrieben, dass er die Plattform überprüft und die für die Plattform geltende Konvention für Zeilenumbrüche verwendet.
Ich habe jedoch etwas Interessantes entdeckt, als ich die aktuell Zeichen, die im TextArea enthalten sind, über eine kleine JavaScript-Funktion, die die den Zeichen entsprechenden Hex-Daten erzeugt.
Für den Test habe ich den folgenden Text eingegeben:
Hallo, Welt[enter]
Auf Wiedersehen, grausame Welt[enter]
Als ich die Textdaten untersuchte, erhielt ich die folgende Bytefolge:
48 65 6c 6f 2c 20 57 6f 72 6c 64 0a 47 6f 6f 64 62 79 65 2c 20 43 72 75 65 6c 20 57 6f 72 6c 64 0a
Die meisten Leute, die dies sehen und 0a, aber keine 0d-Bytes sehen, würden denken, dass diese Ausgabe auf einer Unix/Linux-Plattform erfolgt ist. Aber hier ist der Haken: diese Sequenz habe ich in Google Chrome auf Windows 7 64-bit erhalten.
Wenn Sie also ein TextArea-Element verwenden und den Text untersuchen, überprüfen Sie die Ausgabe, wie ich es oben getan habe, um sicherzustellen, welche tatsächlichen Zeichenbytes von Ihrem TextArea zurückgegeben werden. Ich habe noch zu sehen, wenn dies auf anderen Plattformen oder anderen Browsern unterscheidet, aber es lohnt sich im Auge behalten, wenn Sie Textverarbeitung über JavaScript durchführen, und Sie müssen, dass Textverarbeitung Plattform unabhängig zu machen.
Die in den obigen Beiträgen beschriebenen Konventionen gelten für Konsole Ausgabe, aber HTML-Elemente halten sich anscheinend an die UNIX/Linux-Konvention. Es sei denn, jemand entdeckt etwas anderes auf einer anderen Plattform/Browser.
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.