Por que as pessoas colocam '\ n' no início das strings?

8

Muitas vezes, eu entro no código C onde as printfseqüências de formato começam com \n:

printf ("\ nOlá");

Na minha opinião, isso é irritante e não oferece vantagens (mas muitas desvantagens!) Em relação à impressão "Hello\n":

  • Se a primeira linha impressa começar '\n', a saída do programa começará com uma linha vazia (inútil)
  • Se a última linha impressa não terminar '\n', a saída do programa não terminará com uma nova linha (útil ao ler a saída em um terminal)
  • Na maioria dos terminais (em fluxos de buffer em linha em geral), a saída é liberada quando a '\n'é encontrada; portanto, uma linha que não termina com '\n'pode ser mostrada na tela muito tempo depois de ter sido efetivamente printfd (ou talvez nunca, se o fluxo nunca for liberado) , por exemplo, se o programa travar)

Então, por que as pessoas gostam disso?

peoro
fonte
2
Isso é uma coisinha que realmente me incomoda. Pessoas que fazem cout << endl << ..; também me deixa louco. Eu sei que não há diferença, mas ...
Vitor Py
Você quer dizer "descarga" no sentido de "nova linha" ou como em fflush ()?
LennyProgrammers
@ Lenny222: no sentido de fflush().
peoro 28/06
1
Ah, não percebi, que printf () libera novas linhas, em contraste com os fluxos C ++.
LennyProgrammers
Porque eles estão errados. Em geral, é um erro novato
Basile Starynkevitch

Respostas:

16

Geralmente, isso é feito para garantir que a declaração seja impressa na próxima linha. Se isso for feito no final da linha, o mesmo efeito pode ser derivado. É realmente de pouca importância.

Atualização : Contanto que você escolha uma maneira e a cumpra, isso realmente não vai importar nem um pouco. Se você estiver realmente preocupado, digite todas as suas declarações como "\ nOlá \ n". Se você tem algumas linhas combinadas, isso não é realmente tão difícil de corrigir. Basta voltar e alterar a declaração ofensiva.

Morgan Herlocker
fonte
14
A diferença é que se você colocá-lo no início da linha, garante que ele será impresso em uma nova linha. Se você estiver trabalhando em uma grande base de código, pode haver uma linha impressa antes da sua que não possui uma nova linha anexada.
Robert Anton Reese
1
Isso é particularmente verdadeiro se você estiver colando instruções de impressão para fins de depuração.
precisa
2
Ok, mas dessa maneira uma nova mensagem ( "Hello2\n") pode acabar na mesma linha da sua última (terminando em "\nHelloHello2\n"): isso não é tão ruim quanto ter o seu message on the same line of the previous one (eg: "\nPrevious-messageHello\n"? Se esses dois cenários são ruins da mesma maneira, um programador / projeto deve adotar um padrão (por exemplo: sempre colocando '\n'no início ou no final), mas não consigo ver quais vantagens você poderia ter ao colocar '\n'no início das suas mensagens ...
peoro 29/06
@peoro, acho que minha atualização deve oferecer uma solução se realmente a incomoda.
Morgan Herlocker
5

Duas palavras: preferência pessoal. No grande esquema das coisas, não acho que isso realmente importe. Se você está chateado com isso, pergunte ao autor deste código por que ele o escreve assim. Você pode obter algumas respostas interessantes.

Prefiro todos os meus caracteres de nova linha no final de cada linha.

Bernard
fonte
+1 - É tudo preferência. Eu prefiro a minha nova linha no final da cadeia, mas também porque parece mais natural para mim
Jetti
Pessoalmente, quando tenho saída suficiente para isso importar, tento manter todas as impressões, couts e novas linhas reais em uma única função (talvez em main ()), para evitar bugs bobos relacionados a linhas novas ausentes / extras . Mas talvez eu seja apenas TOC sobre eles.
Ixrec
4

Como alguém que usa essa expressão em alguns contextos - embora eu geralmente colocar \nno final para garantir rubor -, eu posso oferecer uma justificação: Eu tendem a usar este ao formatar muitas linhas, especialmente se começando com uma linha em branco, para que as \ns estão alinhados. Isso significa que é um pouco mais fácil (a) verificar se todas as linhas realmente incluem a \nou (b) ignorá-las como lastro e apenas ler o texto nas linhas. Nessa situação, na verdade, parece mais arrumado para mim também, mas acho todos esses benefícios menores.

Uma abordagem alternativa para minimizar o lastro sintático é usar literais de string, incluindo novas linhas, mas o 6.4.5 no padrão C11 os proíbe, portanto, você deve falar bem com o seu compilador e pensar cuidadosamente sobre o que ele fará.

PJTraill
fonte
3

Um motivo não mencionado (a menos que eu tenha perdido) é que alguns programas CLI usarão '\ r' para atualizar repetidamente uma linha. Por exemplo, com status.

A próxima linha exigirá uma nova linha para que o cursor chegue à próxima (nova) linha.

Outro exemplo (muito ruim) é o local em que o programador está ciente de que vários programas podem estar gravando no mesmo terminal. Nesse caso caótico, há uma chance de que alguma ordem seja imposta pelo '\ n' principal liberando texto em buffer antes de escrever mais e possivelmente misturando as saídas das gravações. Mas essa ordem não é garantida e, mais cedo ou mais tarde, o outro processo entrará e estragará as coisas. Não faça isso em nada que você gostaria de mostrar para sua mãe!

Eu tentaria manter o exemplo acima para fins de depuração e não sujeitaria outros usuários além de você aos resultados. Isso se aplica a várias tarefas não sincronizadas, gravadas no mesmo arquivo (espero que depure) também.

O caso de usar '\ r' para escrever sobre uma linha de texto na tela, no entanto, não é tão raro no mundo da CLI.

Afinal, as coisas acontecem.

Hugh Buntu
fonte