wake-up-neo.com

Unterschied zwischen\n und\r?

Was ist der Unterschied zwischen \n (Zeilenumbruch) und \r (Wagenrücklauf)?

Gibt es insbesondere praktische Unterschiede zwischen \n und \r? Gibt es Orte, an denen einer anstelle des anderen verwendet werden sollte?

485
3zzy

In Bezug auf den ASCII-Code sind es 3 - da sie 10 bzw. 13 sind ;-).

Aber im Ernst, es gibt viele:

  • in Unix und allen Unix-ähnlichen Systemen ist \n der Code für das Zeilenende. \r bedeutet nichts Besonderes
  • folglich ist \n in C und den meisten Sprachen, die es irgendwie kopieren (sogar aus der Ferne), die Standard-Escape-Sequenz für das Zeilenende (je nach Bedarf in/aus OS-spezifischen Sequenzen übersetzt).
  • in alten Mac-Systemen (vor OS X) war stattdessen \r der Code für das Zeilenende
  • in Windows (und in vielen alten Betriebssystemen) besteht der Code für das Zeilenende aus 2 Zeichen, \r\n, in dieser Reihenfolge
  • als eine (überraschende ;-) Folge (die auf ältere Betriebssysteme als Windows zurückgeht) ist \r\n die Standardzeilterminierung für Textformate im Internet
  • bei elektromechanischen Teletyp-artigen "Terminals" befiehlt \r dem Wagen, nach links bis zum Anschlag ganz links zu fahren (langsamer Vorgang), \n befiehlt der Walze, eine Zeile aufzurollen (viel schneller) - aus diesem Grund haben immer \rvor\n, damit sich die Walze bewegen kann, während der Wagen noch nach links fährt! -) Wikipedia hat eine ausführlichere Erklärung .
  • bei Zeichenmodus-Terminals (normalerweise emulieren ältere Druckaufträge wie oben) verhalten sich \r und \n im Raw-Modus ähnlich (mit Ausnahme des Cursors, da kein Wagen oder eine Rolle ist ;-).

In der Praxis sollten Sie im modernen Kontext des Schreibens in eine Textdatei immer \n verwenden (die zugrunde liegende Laufzeitumgebung übersetzt dies, wenn Sie sich auf einem seltsamen Betriebssystem befinden, z. B. Windows ;-)). Der einzige Grund, \r zu verwenden, ist, wenn Sie an ein Zeichenterminal schreiben (oder wahrscheinlich ein "Konsolenfenster", das es emuliert) und möchten, dass die nächste Zeile, die Sie schreiben, die letzte Zeile überschreibt, die Sie gerade geschrieben haben (manchmal für doof "ascii" verwendet) Animation "Effekte von zB Fortschrittsbalken) - dies wird jedoch in einer Welt von GUIs ziemlich obsolet ;-).

690
Alex Martelli

In der Vergangenheit wurde der Wagen mit einem \n nach unten bewegt, während mit dem \r der Wagen zurück auf die linke Seite der Seite verschoben wurde.

108
tster

Zwei verschiedene Charaktere.

\n wird in Unix-Textdateien als Abschlusszeichen für Zeilenende verwendet

\r wird als Abschlusszeichen in Mac-Textdateien verwendet

\r\n (dh beide) werden verwendet, um Zeilen in Windows- und DOS-Textdateien zu beenden.

27
pavium

Da niemand sonst ausdrücklich darauf hingewiesen hat (sind sie zu jung, um sie zu kennen/sich zu erinnern?) - Ich vermute, dass die Verwendung von \r\n für Schreibmaschinen und ähnliche Geräte entstand.

Wenn Sie bei Verwendung einer mehrzeiligen Schreibmaschine eine neue Zeile wünschen, müssen Sie zwei physische Aktionen ausführen: Schieben Sie den Wagen zurück an den Anfang (links in den USA) der Seite und ziehen Sie das Papier um eine Stufe nach oben .

In den Tagen der Zeilendrucker war die einzige Möglichkeit, fetten Text zu erstellen, z. B. ein Wagenrücklauf OHNE Newline. Dann sollten die gleichen Zeichen über den alten gedruckt werden, wodurch mehr Tinte hinzugefügt wurde, sodass er dunkler (fett gedruckt) wirkte. . Wenn die mechanische "Zeilenumbruch" -Funktion in einer Schreibmaschine fehlschlug, war dies das ärgerliche Ergebnis: Sie könnten über die vorherige Textzeile tippen, wenn Sie nicht aufpassen.

19

Zwei verschiedene Zeichen für verschiedene Betriebssysteme. Auch dies spielt eine Rolle bei Daten, die über TCP/IP übertragen werden, was die Verwendung von \r\nerfordert.

\n Unix

\r Mac

\r\n Windows und DOS.

11
a432511

Fertigstellen,

In einem Shell-Skript (Bash) können Sie \r verwenden, um den Cursor vor der Zeile zu senden, 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"
  • Die erste "Echo" -Anzeige AA--AA
  • Die zweite: AA--AABB
  • Das Letzte: BB--AABB

Aber vergessen Sie nicht, -en als Parameter zu verwenden.

7
Akarun

In Windows bewegt sich der\n an den Anfang der nächsten Zeile. Der\r bewegt sich an den Anfang der aktuellen Zeile, ohne zur nächsten Zeile zu gelangen. Ich habe\r in meinen eigenen Konsolen-Apps verwendet, wo ich Code teste und ich möchte nicht, dass Text auf meinem Bildschirm nach oben scrollen. Verwenden Sie also\n, nachdem Sie Text gedruckt haben, beispielsweise eine Framerate ( FPS), ich werde printf ("% - 10d\r", fps); Dadurch wird der Cursor an den Anfang der Zeile zurückgesetzt, ohne zur nächsten Zeile zu gelangen. Dadurch kann ich andere Informationen auf dem Bildschirm anzeigen, die nicht gescrollt werden, während die Bildfrequenz ständig in derselben Zeile aktualisiert wird (% -10 macht dies Die Ausgabe ist mindestens 10 Zeichen lang, linksbündig ausgerichtet, so dass sie mit Leerzeichen aufgefüllt wird, wobei alle alten Werte für diese Zeile überschrieben werden. Für solche Dinge ist dies sehr praktisch, normalerweise wenn ich Debugging-Ausgaben auf meinem Konsolenbildschirm habe.

Eine kleine Geschichte

Das/r steht für "return" oder "Wagenrücklauf", was der Schreibmaschine seine Geschichte verdankt. Ein Wagenrücklauf verschob Ihren Wagen ganz nach rechts, so dass Sie am Zeilenanfang tippten.

Das/n steht für "neue Zeile". Von den Tagen an den Schreibmaschinen aus sind Sie in eine neue Zeile übergegangen. Nicht unbedingt am Anfang, weshalb einige Betriebssysteme die Notwendigkeit von a/r return gefolgt von a/n newline verwendeten, da dies die Reihenfolge war, in der eine Schreibmaschine dies tat. Dies erklärt auch die alten 8bit-Computer, die verwendet wurden "Zurück" statt "Enter", von "Wagenrücklauf", was bekannt war.

3
Neil Roy

Um der Verwirrung noch etwas hinzuzufügen, 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 geschrieben, um die Plattform zu überprüfen und die für die Plattform geltende Newline-Konvention zu verwenden.

Ich habe jedoch etwas Interessantes entdeckt, als ich die in der TextArea enthaltenen actual -Zeichen mit einer kleinen JavaScript-Funktion prüfte, die die den Zeichen entsprechenden Hex-Daten generiert.

Für den Test habe ich folgenden Text eingegeben:

Hallo Welt [Enter]

Auf Wiedersehen, grausame Welt

Als ich die Textdaten überprüfte, war die folgende Bytefolge:

48 65 6c 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 

Nun, die meisten Leute, die dies betrachten und 0a aber keine 0d Bytes sehen, würden denken, dass diese Ausgabe auf einer Unix/Linux-Plattform abgerufen wurde. Aber hier ist der Haken: Diese Sequenz habe ich in Google Chrome unter Windows 7 64-Bit erhalten.

Wenn Sie also ein TextArea-Element verwenden und den Text untersuchen, ÜBERPRÜFEN Sie die Ausgabe wie oben, um sicherzustellen, welche Zeichenbytes tatsächlich von Ihrer TextArea zurückgegeben werden. Ich habe noch nicht herausgefunden, ob sich dies auf anderen Plattformen oder anderen Browsern unterscheidet, aber es lohnt sich zu bedenken, wenn Sie Textverarbeitung über JavaScript ausführen und diese Textverarbeitungsplattform unabhängig machen müssen.

Die in den obigen Beiträgen behandelten Konventionen gelten für die Ausgabe von console, aber HTML-Elemente entsprechen der UNIX/Linux-Konvention. Es sei denn, jemand entdeckt etwas anderes auf einer anderen Plattform/einem anderen Browser.

0
David Edwards
#include <stdio.h>

void main()
{
  int countch=0;
  int countwd=1;

  printf("Enter your sentence in lowercase: ");
  char ch='a';
  while(ch!='\r')
  {
    ch=getche();
    if(ch==' ')
      countwd++;
    else
      countch++;
  }

  printf("\n Words = ",countwd);

  printf("Characters = ",countch-1);

  getch();

}

nehmen wir dieses Beispiel, versuchen Sie,\n anstelle von\r zu setzen.

0