Verschil tussen \n en \r?

Wat is het verschil tussen \n(newline) en \r(carriage return)?

Zijn er met name praktischeverschillen tussen \nen \r? Zijn er plaatsen waar de ene moet worden gebruikt in plaats van de andere?


Antwoord 1, autoriteit 100%

In termen van ascii-code is het 3 — aangezien ze respectievelijk 10 en 13 zijn;-).

Maar serieus, er zijn er veel:

  • in Unix en alle Unix-achtige systemen is \nde code voor end-of-line, \rbetekent niets speciaals
  • als gevolg hiervan is \nin C en de meeste talen die het op de een of andere manier kopiëren (zelfs op afstand), de standaard escape-reeks voor het einde van de regel (vertaald naar/van OS-specifieke reeksen indien nodig )
  • in oude Mac-systemen (vóór OS X) was \rin plaats daarvan de code voor end-of-line
  • in Windows (en veel oude besturingssystemen) is de code voor het einde van de regel 2 tekens, \r\n, in deze volgorde
  • als een (verrassend;-) gevolg (teruggaand naar besturingssystemen die veel ouder zijn dan Windows), is \r\nde standaard regelafsluiting voor tekstformaten op internet
  • voor elektromechanische teletype-achtige “terminals”, beveelt \rde wagen om naar links terug te gaan totdat deze de meest linkse stop raakt (een trage bediening), \ncommando’s de roller om één regel op te rollen (een veel snellere bewerking) — daarom heb je altijd \rvoor\n, zodat de rol kan bewegen terwijl de wagen nog naar links gaat!-) Wikipedia heeft een meer gedetailleerde uitleg.
  • voor aansluitmodus-aansluitingen (het typisch emuleren van zelfs oudere drukken zoals hierboven), in de onbewerkte modus, \ren \nop dezelfde manier (behalve in termen van de cursor, zoals daar is geen wagen of roller; -)

In de praktijk, in de moderne context van het schrijven naar een tekstbestand, moet u altijd \ngebruiken (de onderliggende runtime vertaalt dat als u op een rare OS bent, bijvoorbeeld Windows; -). De enige reden om te gebruiken \ris als u aan een personenterminal schrijft (of waarschijnlijker een “console-venster” die het emuleert) en wil dat de volgende regel u schrijft om de laatste te overschrijven schreef (soms gebruikt voor goofy “ASCII-animatie” -effecten van bijv. Progress Bars) – dit wordt echter behoorlijk verouderd in een wereld van GUIS, hoewel; -).


2, Autoriteit 15%

Historisch gezien een \nwerd gebruikt om het koets naar beneden te verplaatsen, terwijl de \rwerd gebruikt om de wagen terug naar de linkerkant van de pagina te verplaatsen.


3, Autoriteit 5%

Twee verschillende tekens.

\nwordt gebruikt als een eind-of-line-terminator in UNIX-tekstbestanden

\rWAS HELDSICALISCH (PRE-OS X) Gebruikt als een eind-of-line-terminator in MAC-tekstbestanden

\r\n(dwz beide) worden gebruikt om de lijnen in Windows- en DOS-tekstbestanden te beëindigen.


4, Autoriteit 3%

Omdat niemand anders het specifiek noemde (zijn ze te jong om te weten / onthouden?) – Ik vermoed het gebruik van \r\nontstaan ​​voor typemachines en soortgelijke apparaten.

Wanneer u een nieuwe regel wilde tijdens het gebruik van een multi-line-capable typemachine, waren er twee fysieke acties die het moest uitvoeren: schuif de wagen terug naar het begin (links, in de VS) van de pagina en voer het papier in een inkeping op.

Terug in de dagen van lijnprinters De enige manier om gedurfde tekst te doen, bijvoorbeeld, bijvoorbeeld om een ​​koets terug te doen zonder een nieuwe lijn en print dezelfde tekens over de oude, waardoor het meer inkt wordt toegevoegd, waardoor het donkerder wordt (vetgedrukt). Wanneer de mechanische “newline” -functie in een typemachine is mislukt, was dit het irritante resultaat: u zou de vorige regel tekst kunnen typen als u geen aandacht besteedt.


5, Autoriteit 2%

Twee verschillende tekens voor verschillende besturingssystemen. Dit speelt ook een rol in gegevens die overgedragen over TCP/IPdie het gebruik van \r\nvereist.

\nUNIX

\rmac

\r\nWindows en DOS.


6

In vensters gaat de \n naar het begin van de volgende regel. De \r gaat naar het begin van de huidige regel, zonder naar de volgende regel te gaan. Ik heb \r in mijn eigen console-apps gebruikt waar ik wat code aan het testen ben en ik wil niet dat tekst op mijn scherm scrolt, dus in plaats van \n te gebruiken na het afdrukken van wat tekst, bijvoorbeeld een framesnelheid ( FPS), zal ik printf(“%-10d\r”, fps); Hierdoor keert de cursor terug naar het begin van de regel zonder naar de volgende regel te gaan en kan ik andere informatie op het scherm zien die niet wordt weggescrolld terwijl de framerate constant op dezelfde regel wordt bijgewerkt (de %-10 maakt zeker dat de uitvoer ten minste 10 tekens is, links uitgelijnd zodat het wordt opgevuld met spaties, waarbij alle oude waarden voor die regel worden overschreven). Het is best handig voor dit soort dingen, meestal als ik debug dingen uitvoer naar mijn consolescherm.

Een beetje geschiedenis

De /r staat voor “return” of “carriage return” die zijn geschiedenis te danken heeft aan de typemachine. Een regelterugloop verplaatste je regeltoets helemaal naar rechts, zodat je aan het begin van de regel aan het typen was.

De /n staat opnieuw voor “nieuwe regel”, vanaf de tijd dat je op de typemachine naar een nieuwe regel ging. Niet per se aan het begin ervan, daarom hebben sommige besturingssystemen de behoefte aangenomen voor zowel een /r return gevolgd door een /n nieuwe regel, aangezien dat de volgorde was waarin een typemachine het deed. Het verklaart ook de oude 8bit-computers die om “Return” te hebben in plaats van “Enter”, van “carriage return”, wat bekend was.


Antwoord 7

Wat is het verschil tussen \n (newline) en \r (carriage return)?

Zijn er met name praktische verschillen tussen \nen \r? Zijn er plaatsen waar de ene moet worden gebruikt in plaats van de andere?


Ik wil graag een kort experiment maken met de respectieve escape-sequenties van \nvoor Newline en \rvoor Carriage Return to Illustrate waar het verschillende verschil tussen hen is .

Ik weet dat deze vraag is gesteld als taalonafhankelijk. Niettemin hebben we althans een taal nodig om het experiment te vervullen. In mijn geval heb ik C++ gekozen, maar het experiment is in het algemeen in elke programmeertaal van toepassing.

Het programma toont gewoon alleen om een ​​zin in de console af te drukken, gedaan door een for-lus iteratie.


Newline-programma:

#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;
}

Uitgang:

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

Kennisgeving, dat dit resultaat niet op elk -systeem wordt verstrekt, voert u deze C++ -code uit. Maar het zal voor de modernste systemen werken. Lees hieronder voor meer informatie.


Nu, hetzelfde programma, maar met het verschil, dat \nwordt vervangen door \raan het einde van de afdruksequentie.

Carriage Retour-programma:

#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;
}

Uitgang:

7.Walkthrough of the for-loop 

Gemerkt waar het verschil zit? Het verschil is simpelweg dat, wanneer u de Carriage return escape-reeks \raan het einde van elke afdrukreeks gebruikt, de volgende iteratie van deze reeks niet in de volgende tekstregel komt – Aan het einde van elke afdrukreeks is de cursor niet naar het *begin van de volgende regel gesprongen.

In plaats daarvan sprong de cursor terug naar het begin van de regel, waar hij aan het einde van was, voordat hij het teken \rgebruikte. – Het resultaat is dat elke volgende iteratie van de afdrukvolgorde de vorige vervangt.

*Opmerking: Een \nspringt niet noodzakelijk naar het begin van de volgende tekstregel. Op sommige, in het algemeen meer oudere, besturingssystemen kan het resultaat van het \nteken voor de nieuwe regel zijn, dat het naar een willekeurige plaats in de volgende regel springt, niet alleen naar het begin. Daarom moeten ze \r \ngebruiken om aan het begin van de volgende tekstregel te komen.


Dit experiment liet ons het verschil zien tussen nieuwe regel en regelterugloop in de context van de uitvoervan de iteratie van een afdrukreeks.

Bij het bespreken van de invoerin een programma, kunnen sommige terminals/consoles een regelterugloop impliciet omzetten in een nieuwe regel voor betere draagbaarheid, compatibiliteit en integriteit.

Maar als je de keuze hebt om de ene voor de andere te kiezen of expliciet alleen een specifieke wilt of moet gebruiken, moet je altijd werken met degene die past bij het doel en er strikt onderscheid tussen maken.


8

#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();
}

Laten we dit voorbeeld innemen Probeer \ n in plaats van \ r het zal niet werken en proberen te raden waarom?

Other episodes