Qual é a diferença entre \n
(nova linha) e \r
(retorno de carro)?
Em particular, existem diferenças práticas entre \n
e \r
? Existem lugares onde um deve ser usado em vez do outro?
Qual é a diferença entre \n
(nova linha) e \r
(retorno de carro)?
Em particular, existem diferenças práticas entre \n
e \r
? Existem lugares onde um deve ser usado em vez do outro?
Respostas:
Em termos de código ascii, é 3 - já que são 10 e 13, respectivamente ;-).
Mas, falando sério, existem muitos:
\n
é o código para final de linha, \r
não significa nada de especial\n
é a sequência de escape padrão para o final da linha (traduzida para / de sequências específicas do SO, conforme necessário)\r
era o código para o final de linha\r\n
nesta ordem\r\n
é a terminação de linha padrão para formatos de texto na Internet\r
ordena que o carro volte para a esquerda até atingir a parada mais à esquerda (uma operação lenta), \n
ordena que o rolo enrole uma linha (uma operação muito mais rápida) - é por isso que você sempre tem \r
antes \n
, para que o rolo possa se mover enquanto o carro ainda está indo para a esquerda! -) A Wikipedia tem uma explicação mais detalhada .\r
e \n
actuam de modo semelhante (excepto tanto em termos do cursor, como não é nenhuma carro ou rolo ;-)Na prática, no contexto moderno de gravação em um arquivo de texto, você deve sempre usar \n
(o tempo de execução subjacente traduzirá isso se você estiver em um sistema operacional estranho, por exemplo, Windows ;-). A única razão para usar \r
é se você estiver gravando em um terminal de caractere (ou, mais provavelmente, em uma "janela do console" emulando-o) e quiser que a próxima linha que você escreve substitua a última que você acabou de escrever (às vezes usada para animação ascii pateta) "efeitos de, por exemplo, barras de progresso) - isso está ficando bastante obsoleto em um mundo de GUIs ;-).
\0
) foram adicionados após a \n
permitir que o adicional Tempo. Isso foi tratado de forma transparente pelo sistema operacional, para que você não encontre nenhum vestígio no código legado.
\r
(estou usando o Linux). Depois que comecei a analisar o que parecia ser um arquivo válido, meu analisador falhou porque o arquivo que eu estava analisando foi criado no Windows. : D O principal problema em tudo o que é que nenhum \n
, ou \r
são visíveis no sentido de que, por exemplo a
, .
, (
etc. caracteres são.
Historicamente, um \n
foi usado para mover o carro para baixo, enquanto o \r
foi usado para mover o carro de volta para o lado esquerdo da página.
printf("abcdefghijlm\rNOP\n");
Compilado com o gcc-8 no OpenSuSe e execute em um terminal resulta nesta saída NOPdefghijlm
. O \ r (retorno de carro) na string faz com que o cursor se mova para o início da linha (carro) e os caracteres após o \ r (ou seja, "NOP") sobrescrevem o que estava lá anteriormente (ou seja, o "abc")! Você pode obter um "movimento de carruagem" semelhante com backspace (\ b) como o printf("abcdefghijlm\b\bNOP\n");
que produz #abcdefghijNOP
Dois personagens diferentes.
\n
é usado como um terminador de fim de linha em arquivos de texto Unix
\r
é usado como um terminador de fim de linha em arquivos de texto do Mac
\r\n
(ou seja, ambos) são usados para finalizar linhas nos arquivos de texto do Windows e do DOS.
\r
não existe o final de linha em um Mac há muito tempo. Com o lançamento do Mac OS X em 2001 (que é baseado em Unix), \n
agora é usado.
\r
- por exemplo, MS Office 2011 Excel: salvando um CSV (com todas as configurações padrão) - salvará um arquivo codificado ISO-8859-1 com \r
terminações de linha.
Como ninguém mais o mencionou especificamente (eles são jovens demais para saber / lembrar?) - Suspeito que o uso de \r\n
originou para máquinas de escrever e dispositivos similares.
Quando você queria uma nova linha enquanto usava uma máquina de escrever com capacidade para várias linhas, havia duas ações físicas a serem executadas: deslize o carro de volta ao início (à esquerda, nos EUA) da página e alimente o papel em um ponto .
Na época das impressoras de linha, a única maneira de fazer texto em negrito, por exemplo, era fazer um retorno de carro SEM uma nova linha e imprimir os mesmos caracteres sobre os antigos, adicionando mais tinta, fazendo com que parecesse mais escuro (em negrito) . Quando a função mecânica "nova linha" falhou em uma máquina de escrever, este foi o resultado irritante: você poderia digitar na linha de texto anterior se não estivesse prestando atenção.
Dois caracteres diferentes para diferentes sistemas operacionais. Além disso, isso desempenha um papel nos dados transmitidos sobre os TCP/IP
quais requer o uso de\r\n
.
\n
Unix
\r
Mac
\r\n
Windows e DOS.
Completar,
Em um script shell (bash), você pode usar \r
para enviar o cursor, na frente da linha e, é claro, \n
para colocar o cursor em uma nova linha.
Por exemplo, tente:
echo -en "AA--AA" ; echo -en "BB" ; echo -en "\rBB"
AA--AA
AA--AABB
BB--AABB
Mas não se esqueça de usar -en
como parâmetros.
Nas janelas, o \ n se move para o início da próxima linha. O \ r se move para o início da linha atual, sem passar para a próxima linha. Eu usei \ r em meus próprios aplicativos de console, onde estou testando algum código e não quero ver o texto rolando na tela, em vez de usar \ n depois de imprimir algum texto, por exemplo, uma taxa de quadros ( FPS), vou imprimirf ("% - 10d \ r", fps); Isso retornará o cursor para o início da linha sem passar para a próxima linha e me permitirá ter outras informações na tela que não são roladas enquanto a taxa de quadros é atualizada constantemente na mesma linha (a% -10 faz certo que a saída tem pelo menos 10 caracteres, deixada justificada para que ela seja preenchida por espaços, substituindo quaisquer valores antigos para essa linha). É bastante útil para coisas assim,
Um pouco de história
O / r significa "retorno" ou "retorno de carro", que deve sua história à máquina de escrever. Um retorno de carro moveu seu carro para a direita, para que você estivesse digitando no início da linha.
O / n significa "nova linha", novamente, dos dias da máquina de escrever que você mudou para uma nova linha. No entanto, não necessariamente no início, e é por isso que alguns sistemas operacionais adotaram a necessidade de retorno a / r seguido por uma nova linha / n, pois foi nessa ordem que a máquina de escrever o fez. Também explica os antigos computadores de 8 bits que usavam ter "Retorno" em vez de "Enter", de "retorno de carro", que era familiar.
Apenas para aumentar a confusão, eu tenho trabalhado em um editor de texto simples usando um elemento TextArea em uma página HTML em um navegador. Antecipando problemas de compatibilidade com relação ao CR / LF, escrevi o código para verificar a plataforma e use a convenção de nova linha aplicável à plataforma.
No entanto, descobri algo interessante ao verificar os caracteres reais contidos na TextArea, por meio de uma pequena função JavaScript que gera os dados hexadecimais correspondentes aos caracteres.
Para o teste, digitei o seguinte texto:
Olá mundo [entrar]
Adeus, mundo cruel [entrar]
Quando examinei os dados do texto, a sequência de bytes que obtive foi a seguinte:
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
Agora, a maioria das pessoas olhando para isso e vendo 0a, mas não 0d bytes, pensaria que essa saída foi obtida em uma plataforma Unix / Linux. Mas aqui está o problema: essa sequência eu obtive no Google Chrome no Windows 7 de 64 bits.
Portanto, se você estiver usando um elemento TextArea e examinando o texto, VERIFIQUE a saída como fiz acima, para garantir que bytes de caracteres reais são retornados de sua TextArea. Ainda estou para ver se isso difere em outras plataformas ou outros navegadores, mas vale a pena ter em mente se você estiver executando o processamento de texto via JavaScript e precisar tornar essa plataforma de processamento de texto independente.
As convenções abordadas nas postagens acima se aplicam à saída do console , mas os elementos HTML, ao que parece, aderem à convenção UNIX / Linux. A menos que alguém descubra o contrário em uma 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();
}
vamos dar este exemplo, tente colocar \ n no lugar de \ r não funcionará e tentar adivinhar por quê?
Return
e Enter
. Até o meu teclado sem fio moderno ainda mostra o baixo-e-seta para trás na velha Return
tecla (que agora é intitulado "Enter" para ser coerente com o teclado numérico Enter
chave, que não mostra a seta)
Qual é a diferença entre \ n (nova linha) e \ r (retorno de carro)?
Em particular, existem diferenças práticas entre
\n
e\r
? Existem lugares onde um deve ser usado em vez do outro?
Eu gostaria de fazer um breve experimento com as respectivas seqüências de escape de \n
for newline e \r
de retorno de carro para ilustrar onde está a diferença distinta entre eles.
Eu sei que essa pergunta foi feita como independente de idioma. No entanto, precisamos de uma linguagem pelo menos para realizar o experimento. No meu caso, eu escolhi C ++, mas o experimento geralmente deve ser aplicado em qualquer linguagem de programação.
O programa simplesmente itera para imprimir uma frase no console, feita por uma iteração for-loop.
Programa de nova linha:
#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;
}
Resultado:
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
Observe que esse resultado não será fornecido em nenhum sistema; você está executando este código C ++. Mas deve funcionar para os sistemas mais modernos. Leia abaixo para mais detalhes.
Agora, o mesmo programa, mas com a diferença, que \n
é substituído por \r
no final da sequência de impressão.
Programa de retorno 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;
}
Resultado:
7.Walkthrough of the for-loop
Percebeu onde está a diferença? A diferença é simplesmente a seguinte: quando você usa a sequência de escape de retorno de carro \r
no final de cada sequência de impressão, a próxima iteração dessa sequência não entra na seguinte linha de texto - No final de cada sequência de impressão, o cursor não saltou para o * início da próxima linha.
Em vez disso, o cursor retornou ao início da linha, na qual ele estava no final, antes de usar o \r
caractere. - O resultado é que cada iteração a seguir da sequência de impressão está substituindo a anterior.
* Nota: A \n
não necessariamente salta para o início da seguinte linha de texto. Em alguns sistemas, em geral mais antigos, o resultado do \n
caractere de nova linha pode ser que ele pula para qualquer lugar da linha seguinte, não apenas para o começo. É por isso que eles precisam usar \r \n
para chegar ao início da próxima linha de texto.
Esse experimento nos mostrou a diferença entre nova linha e retorno de carro no contexto da saída da iteração de uma sequência de impressão.
Ao discutir sobre a entrada em um programa, alguns terminais / consoles podem converter um retorno de carro em uma nova linha implicitamente para melhor portabilidade, compatibilidade e integridade.
Mas se você tiver a opção de escolher um para outro ou desejar ou precisar usar explicitamente apenas um específico, você deve sempre operar com aquele que se adapte ao seu objetivo e faça uma distinção estrita entre eles.