¿Cuál es la diferencia entre \n
(nueva línea) y \r
(retorno de carro)?
En particular, ¿hay alguna diferencia práctica entre \n
y \r
? ¿Hay lugares donde se debe usar uno en lugar del otro?
¿Cuál es la diferencia entre \n
(nueva línea) y \r
(retorno de carro)?
En particular, ¿hay alguna diferencia práctica entre \n
y \r
? ¿Hay lugares donde se debe usar uno en lugar del otro?
Respuestas:
En términos de código ASCII, es 3, ya que son 10 y 13 respectivamente ;-).
Pero en serio, hay muchos:
\n
es el código para el final de línea, \r
no significa nada especial\n
es la secuencia de escape estándar para el final de línea (traducida a / desde secuencias específicas del sistema operativo según sea necesario)\r
era el código para el final de línea\r\n
, en este orden\r\n
es la terminación de línea estándar para formatos de texto en Internet\r
ordena al carro que retroceda hacia la izquierda hasta llegar al tope más a la izquierda (una operación lenta), \n
ordena al rodillo que ruede hacia arriba una línea (una operación mucho más rápida) - esa es la razón por la que siempre tiene \r
¡antes \n
, para que el rodillo pueda moverse mientras el carro aún se mueve hacia la izquierda! -) Wikipedia tiene una explicación más detallada .\r
y \n
actuar de manera similar (excepto tanto en términos de la cursor, ya que no es ningún carro o rodillo ;-)En la práctica, en el contexto moderno de escribir en un archivo de texto, siempre debe usar \n
(el tiempo de ejecución subyacente lo traducirá si está en un sistema operativo extraño, por ejemplo, Windows ;-). La única razón para usar \r
es si está escribiendo en un terminal de caracteres (o más probablemente una "ventana de consola" que lo emula) y desea que la siguiente línea que escriba sobrescriba la última que acaba de escribir (a veces utilizada para una animación ascii tonta) "efectos de, por ejemplo, barras de progreso) - esto se está volviendo bastante obsoleto en un mundo de GUI, sin embargo ;-).
\0
se agregaron caracteres inofensivos adicionales (generalmente NUL, es decir ) después \n
de permitir el extra hora. Esto fue manejado de manera transparente por el sistema operativo, por lo que no encontrará rastros en el código heredado.
\r
(estoy usando Linux). Una vez que comencé a analizar lo que parecía ser un archivo válido, mi analizador falló porque el archivo que estaba analizando se creó en Windows. : D El principal problema en todo lo que es que ni \n
o \r
son visibles en el sentido de que, por ejemplo a
, .
, (
etc. personajes son.
Históricamente, \n
se usaba para mover el carro hacia abajo, mientras que \r
se usaba para mover el carro de regreso al lado izquierdo de la página.
printf("abcdefghijlm\rNOP\n");
Compilado con gcc-8 en OpenSuSe y ejecutado en un terminal da como resultado esta salida NOPdefghijlm
. ¡El \ r (retorno de carro) en la cadena da como resultado que el cursor se mueva al comienzo de la línea (carro) y los caracteres que siguen al \ r (es decir, "NOP") sobrescriben lo que estaba previamente allí (es decir, el "abc")! Puede lograr un "movimiento de carro" similar con retroceso (\ b) como el printf("abcdefghijlm\b\bNOP\n");
que produceabcdefghijNOP
Dos personajes diferentes
\n
se utiliza como un terminador de fin de línea en archivos de texto Unix
\r
se utiliza como un terminador de fin de línea en archivos de texto de Mac
\r\n
(es decir, ambos) se utilizan para terminar líneas en archivos de texto de Windows y DOS.
\r
no ha sido el final de línea en una Mac durante mucho tiempo. Con el lanzamiento de Mac OS X en 2001 (que está basado en Unix), \n
ahora se usa.
\r
, por ejemplo, MS Office 2011 Excel: guardar un CSV (con todas las configuraciones predeterminadas) guardará un archivo codificado ISO-8859-1 con \r
terminaciones de línea.
Como nadie más lo mencionó específicamente (¿son demasiado jóvenes para saberlo / recordarlo?), Sospecho que el uso se \r\n
originó para máquinas de escribir y dispositivos similares.
Cuando quería una nueva línea mientras usaba una máquina de escribir con capacidad para varias líneas, había dos acciones físicas que tenía que realizar: deslice el carro hacia el principio (izquierda, en EE. UU.) De la página y alimente el papel una muesca .
En los días de las impresoras lineales, la única forma de hacer texto en negrita, por ejemplo, era hacer un retorno de carro SIN una nueva línea e imprimir los mismos caracteres sobre los antiguos, agregando así más tinta, haciendo que parezca más oscuro (en negrita) . Cuando la función mecánica de "nueva línea" fallaba en una máquina de escribir, este era el resultado molesto: podía escribir sobre la línea de texto anterior si no estaba prestando atención.
Dos personajes diferentes para diferentes sistemas operativos. Además, esto juega un papel en los datos transmitidos TCP/IP
que requieren el uso de\r\n
.
\n
Unix
\r
Mac
\r\n
Windows y DOS.
Completar,
En una secuencia de comandos de shell (bash), puede usar \r
para enviar el cursor, al frente en línea y, por supuesto, \n
para colocar el cursor en una nueva línea.
Por ejemplo, intente:
echo -en "AA--AA" ; echo -en "BB" ; echo -en "\rBB"
AA--AA
AA--AABB
BB--AABB
Pero no te olvides de usar -en
como parámetros.
En Windows, el \ n se mueve al comienzo de la siguiente línea. El \ r se mueve al comienzo de la línea actual, sin moverse a la línea siguiente. He usado \ r en mis propias aplicaciones de consola donde estoy probando un código y no quiero ver texto desplazándose por mi pantalla, así que en lugar de usar \ n después de imprimir algo de texto, por ejemplo, una velocidad de fotogramas ( FPS), imprimiré f ("% - 10d \ r", fps); Esto devolverá el cursor al comienzo de la línea sin moverse a la siguiente línea y me permitirá tener otra información en la pantalla que no se desplaza mientras la velocidad de cuadros se actualiza constantemente en la misma línea (el% -10 hace seguro de que la salida tiene al menos 10 caracteres, se justifica a la izquierda para que quede rellenada por espacios, sobrescribiendo los valores antiguos de esa línea). Es bastante útil para cosas como esta,
Una pequeña historia
El / r significa "retorno" o "retorno de carro" que debe su historial a la máquina de escribir. Un retorno de carro movió su carro completamente hacia la derecha, por lo que estaba escribiendo al comienzo de la línea.
El / n significa "nueva línea", nuevamente, desde los días de máquina de escribir que movió a una nueva línea. Sin embargo, no es muy común al principio, por lo que algunos sistemas operativos adoptaron la necesidad de un retorno a / r seguido de una nueva línea / n, ya que ese fue el orden en que lo hizo una máquina de escribir. También explica las viejas computadoras de 8 bits que usaban tener "Retorno" en lugar de "Enter", de "retorno de carro", que era familiar.
Solo para agregar a la confusión, he estado trabajando en un editor de texto simple usando un elemento TextArea en una página HTML en un navegador. En previsión de problemas de compatibilidad con respecto a CR / LF, escribí el código para verificar la plataforma y usar cualquier convención de nueva línea que sea aplicable a la plataforma.
Sin embargo, descubrí algo interesante al verificar los caracteres reales contenidos en TextArea, a través de una pequeña función de JavaScript que genera los datos hexadecimales correspondientes a los caracteres.
Para la prueba, escribí el siguiente texto:
Hola mundo [enter]
Adiós, mundo cruel [entrar]
Cuando examiné los datos del texto, la secuencia de bytes que obtuve fue la siguiente:
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
Ahora, la mayoría de las personas que miran esto y ven 0a pero no 0d bytes, pensarían que esta salida se obtuvo en una plataforma Unix / Linux. Pero, aquí está el problema: esta secuencia la obtuve en Google Chrome en Windows 7 de 64 bits.
Por lo tanto, si está utilizando un elemento TextArea y examina el texto, COMPRUEBE la salida como lo hice anteriormente, para asegurarse de qué bytes de caracteres reales devuelve su TextArea. Todavía tengo que ver si esto difiere en otras plataformas u otros navegadores, pero vale la pena tener en cuenta si está realizando el procesamiento de texto a través de JavaScript, y necesita hacer que esa plataforma de procesamiento de texto sea independiente.
Las convenciones cubiertas en las publicaciones anteriores se aplican a la salida de la consola , pero los elementos HTML, al parecer, se adhieren a la convención UNIX / Linux. A menos que alguien descubra lo contrario en una plataforma / navegador diferente.
#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();
}
tomemos este ejemplo, intente poner \ n en lugar de \ r no funcionará e intente adivinar por qué.
Return
y Enter
. Incluso mi teclado inalámbrico moderno todavía muestra la flecha hacia abajo y hacia atrás en la Return
tecla anterior (que ahora se titula "Enter" para ser coherente con la Enter
tecla del teclado numérico , que no muestra la flecha)
¿Cuál es la diferencia entre \ n (nueva línea) y \ r (retorno de carro)?
En particular, ¿hay alguna diferencia práctica entre
\n
y\r
? ¿Hay lugares donde se debe usar uno en lugar del otro?
Me gustaría hacer un breve experimento con las respectivas secuencias de escape de \n
for newline y\r
para retorno de carro para ilustrar dónde está la diferencia distintiva entre ellas.
Sé que esta pregunta se hizo como idioma independiente. No obstante, necesitamos un idioma al menos para cumplir con el experimento. En mi caso, elegí C ++, pero el experimento generalmente será aplicable en cualquier lenguaje de programación.
El programa simplemente itera para imprimir una oración en la consola, realizada por una iteración for-loop.
Programa de nueva línea:
#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;
}
Salida:
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
Tenga en cuenta que este resultado no se proporcionará en ningún sistema, está ejecutando este código C ++. Pero funcionará para los sistemas más modernos. Lea abajo para más detalles.
Ahora, el mismo programa, pero con la diferencia, que \n
se reemplaza por \r
al final de la secuencia de impresión.
Programa de devolución de carro:
#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;
}
Salida:
7.Walkthrough of the for-loop
¿Notó dónde está la diferencia? La diferencia es simplemente así, cuando usa la secuencia de escape de retorno de carro\r
al final de cada secuencia de impresión, la siguiente iteración de esta secuencia no entra en la siguiente línea de texto: al final de cada secuencia de impresión, el cursor no saltó al principio * de la siguiente línea.
En cambio, el cursor saltó de regreso al comienzo de la línea, en la que se encontraba al final de, antes de usar el \r
personaje. - El resultado es que cada siguiente iteración de la secuencia de impresión está reemplazando a la anterior.
* Nota: A \n
no necesariamente salta al comienzo de la siguiente línea de texto. En algunos sistemas operativos, en general más antiguos, el resultado del \n
carácter de nueva línea puede ser que salte a cualquier parte de la línea siguiente, no solo al principio. Es por eso que requieren usar \r \n
para llegar al comienzo de la siguiente línea de texto.
Este experimento nos mostró la diferencia entre la nueva línea y el retorno de carro en el contexto de la salida de la iteración de una secuencia de impresión.
Cuando se discute sobre la entrada en un programa, algunos terminales / consolas pueden convertir un retorno de carro en una nueva línea implícitamente para una mejor portabilidad, compatibilidad e integridad.
Pero si tiene la opción de elegir uno para otro o desea o necesita usar explícitamente solo uno específico, siempre debe operar con el que se ajuste a su propósito y distinguir estrictamente entre ellos.