Differenza tra \ n e \ r?

Qual è la differenza tra \n (newline) e \r (ritorno a capo)?

In particolare, ci sono delle differenze pratiche tra \n e \r ? Ci sono luoghi in cui uno dovrebbe essere usato al posto dell’altro?

In termini di codice ASCII, è 3 – poiché sono rispettivamente 10 e 13 ;-).

Ma sul serio, ce ne sono molti:

  • in Unix e in tutti i sistemi di tipo Unix, \n è il codice per il fine linea, \r non significa nulla di speciale
  • di conseguenza, in C e nella maggior parte delle lingue che in qualche modo lo copia (anche da remoto), \n è la sequenza di escape standard per la fine della riga (tradotta in / da sequenze specifiche del sistema operativo secondo necessità)
  • nei vecchi sistemi Mac (pre-OS X), \r era invece il codice per il fine linea
  • in Windows (e in molti vecchi SO), il codice per la fine della riga è di 2 caratteri, \r\n , in questo ordine
  • come conseguenza (sorprendente 😉 (tornare ai sistemi operativi molto più vecchi di Windows), \r\n è la terminazione di riga standard per i formati di testo su Internet
  • per “terminali” elettromeccanici simili a telescriventi, \r ordina al carrello di tornare indietro a sinistra finché non colpisce l’arresto più a sinistra (un’operazione lenta), \n ordina al rullo di arrotolare una linea (un’operazione molto più veloce) – questo è il motivo per cui hai sempre \r prima di \n , in modo che il rullo possa spostarsi mentre il carrello sta ancora andando verso sinistra! -) Wikipedia ha una spiegazione più dettagliata .
  • per i terminali in modalità carattere (in genere emulando quelli di stampa ancora più vecchi come sopra), in modalità raw, \r e \n agiscono in modo simile (tranne entrambi in termini di cursore, poiché non c’è carrello o rullo 😉

In pratica, nel contesto moderno della scrittura in un file di testo, dovresti sempre usare \n (il runtime sottostante lo tradurrà se sei su un sistema operativo strano, ad esempio Windows ;-). L’unico motivo per usare \r è se stai scrivendo su un terminale di carattere (o più probabilmente su una “finestra di console” che lo emula) e vuoi che la riga successiva che scrivi per sovrascrivere l’ultimo che hai appena scritto (a volte usato per sciocchi ” animazione ASCII “effetti di barre di avanzamento ad esempio) – questo sta diventando piuttosto obsoleto in un mondo di GUI, però ;-).

Storicamente è stato utilizzato \n per spostare il carrello verso il basso, mentre \r stato utilizzato per spostare il carrello sul lato sinistro della pagina.

Due personaggi diversi

\n viene utilizzato come terminatore di fine riga nei file di testo Unix

\r viene utilizzato come terminatore di fine riga nei file di testo Mac

\r\n (cioè entrambi) sono usati per terminare le righe nei file di testo di Windows e DOS.

Dal momento che nessuno lo ha menzionato in modo specifico (sono troppo giovani per sapere / ricordare?) – Sospetto che l’uso di \r\n creato per macchine da scrivere e dispositivi simili.

Quando si desiderava una nuova linea mentre si utilizza una macchina da scrivere multi-linea, c’erano due azioni fisiche che doveva eseguire: far scorrere il carrello all’inizio (a sinistra, negli Stati Uniti) della pagina e far avanzare il foglio di una tacca .

Ai tempi delle stampanti di linea, l’unico modo per fare testo in grassetto, ad esempio, era fare un ritorno a capo SENZA una nuova riga e stampare gli stessi caratteri su quelli vecchi, aggiungendo così più inchiostro, facendolo apparire più scuro (in grassetto) . Quando la funzione “newline” meccanica ha fallito con una macchina da scrivere, questo è stato il risultato fastidioso: è ansible digitare sulla riga di testo precedente se non si presta attenzione.

Due caratteri diversi per diversi sistemi operativi. Anche questo ha un ruolo nei dati trasmessi su TCP/IP che richiede l’uso di \r\n .

\n Unix

\r Mac

\r\n Windows e DOS.

Completare,

In uno script di shell (bash), puoi usare \r per inviare il cursore, in prima fila e, naturalmente \n per posizionare il cursore su una nuova riga.

Ad esempio, prova:

 echo -en "AA--AA" ; echo -en "BB" ; echo -en "\rBB" 
  • Il primo display “eco” AA--AA
  • Il secondo: AA--AABB
  • L’ultimo: BB--AABB

Ma non dimenticare di usare -en come parametri.

In windows, \ n si sposta all’inizio della riga successiva. \ R si sposta all’inizio della riga corrente, senza passare alla riga successiva. Ho usato \ r nelle mie app di console in cui sto testando un po ‘di codice e non voglio vedere il testo scorrere sullo schermo, quindi piuttosto che usare \ n dopo aver stampato del testo, ad esempio, un frame rate ( FPS), stamperò (“% – 10d \ r”, fps); Ciò restituirà il cursore all’inizio della riga senza spostarsi alla riga successiva e consentirmi di avere altre informazioni sullo schermo che non vengono disconnesse mentre il framerate si aggiorna costantemente sulla stessa riga (il% -10 rende certo l’output è di almeno 10 caratteri, giustificato a sinistra quindi finisce riempito da spazi, sovrascrivendo eventuali vecchi valori per quella linea). È abbastanza utile per cose come questa, di solito quando eseguo il debug dell’output della roba sullo schermo della mia console.

Un po ‘di storia

Il / r sta per “return” o “carriage return” che deve la sua storia alla macchina da scrivere. Un ritorno a capo ha spostato il carrello completamente a destra in modo da digitare all’inizio della riga.

Il / n sta per “nuova linea”, ancora una volta, dai giorni della macchina da scrivere, si è passati ad una nuova linea. Tuttavia, non necessariamente all’inizio di questo, per cui alcuni SO hanno adottato la necessità di un ritorno a / r seguito da una linea di fine riga, poiché questo era l’ordine in cui una macchina da scrivere lo faceva. Spiega anche i vecchi computer a 8 bit che usavano avere “Return” piuttosto che “Invio”, da “carriage return”, che era familiare.

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

Prendiamo questo esempio prova a mettere \ n al posto di \ r non funzionerà e prova a indovinare perché?