¿Por qué la gente pone '\ n' al comienzo de las cadenas?

8

Muy a menudo me meto en el código C donde las printfcadenas de formato comienzan con \n:

printf ("\ nHola");

En mi opinión, esto es algo molesto que no ofrece ventajas (¡sino muchas desventajas!) Con respecto a la impresión "Hello\n":

  • Si la primera línea impresa comienza con '\n', la salida del programa comenzará con una línea vacía (inútil)
  • Si la última línea impresa no termina con '\n', la salida del programa no terminará con una nueva línea (útil cuando se lee la salida en un terminal)
  • En la mayoría de los terminales (en líneas de secuencias almacenadas en línea en general), la salida se vacía cuando '\n'se encuentra una, por lo que una línea que no termina con '\n'podría mostrarse en la pantalla mucho tiempo después de que haya sido realmente printf'd (o tal vez nunca, si la transmisión nunca se vacía) , por ejemplo, si el programa falla)

Entonces, ¿por qué a la gente le gusta esto?

peoro
fuente
2
Esto es una pequeña cosa que realmente me molesta. Las personas que hacen cout << endl << ..; También me vuelve loco. Sé que no hay diferencia, pero ...
Vitor Py
¿Te refieres a "flushing" en el sentido de "nueva línea" o como en fflush ()?
LennyProgrammers
@ Lenny222: en el sentido de fflush().
peoro
1
Ah, no me he dado cuenta, que printf () se vacía en las nuevas líneas, en contraste con las transmisiones de C ++.
LennyProgrammers
Porque están equivocados Generalmente es un error de novato
Basile Starynkevitch

Respuestas:

16

En general, se hace para garantizar que la declaración se imprima en la siguiente línea. Si se hace al final de la línea, se puede derivar el mismo efecto. Realmente es de poca consecuencia.

Actualización : siempre que elijas un camino y te quedes con él, realmente no va a importar un poco. Si está realmente preocupado, escriba todas sus declaraciones como "\ nHola \ n". Si tiene algunas líneas combinadas, entonces este no es un "error" difícil de solucionar. Simplemente regrese y cambie la declaración ofensiva.

Morgan Herlocker
fuente
14
La diferencia es que si lo coloca al comienzo de la línea, garantiza que se imprimirá en una nueva línea. Si está trabajando en una gran base de código, es posible que se imprima una línea antes de la suya que no tiene una nueva línea añadida.
Robert Anton Reese
1
Esto es particularmente cierto si está pegando en las declaraciones de impresión para fines de depuración.
Peter Rowell
2
Ok, pero de esta manera un nuevo mensaje ( "Hello2\n") podría terminar en la misma línea de su último mensaje ( terminando en "\nHelloHello2\n"): ¿no es tan malo como tener su message on the same line of the previous one (eg: "\nPrevious-messageHello\n")? Si estos dos escenarios son malos de la misma manera, un programador / proyecto debe adoptar un estándar (por ejemplo: siempre '\n'al principio o al final), pero no puedo ver qué ventajas podría tener al poner '\n'al principio de sus mensajes ...
peoro
@peoro, creo que mi actualización debería ofrecer una solución si realmente te molesta.
Morgan Herlocker
5

Dos palabras: preferencia personal. En el gran esquema de las cosas, no creo que esto realmente importe. Si le molesta, pregunte al autor de este código por qué lo escriben así. Puede obtener algunas respuestas interesantes.

Prefiero todos mis caracteres de nueva línea al final de cada línea de todos modos.

Bernardo
fuente
+1: todo es preferencia. Prefiero mi nueva línea al final de la cadena también porque me parece más natural
Jetti
Personalmente, cuando tengo suficiente salida para que esto tenga importancia, trato de mantener todas las printfs, couts y nuevas líneas reales en una sola función (tal vez arriba en main ()) para poder evitar cualquier error tonto relacionado con las nuevas líneas faltantes / extra . Pero tal vez solo soy TOC sobre ellos.
Ixrec
4

Como alguien que usa este idioma en algunos contextos, aunque generalmente lo pongo \nal final para garantizar el enjuague, puedo ofrecer una justificación: tiendo a usar esto cuando formateo muchas líneas, especialmente si comienza con una línea vacía, de modo que el \ns están alineados Esto significa que es algo más fácil (a) verificar que todas las líneas sí incluyen a \no (b) para ignorarlas como lastre, y simplemente leer el texto en las líneas. En esta situación, a mí también me parece más ordenado, pero todos estos beneficios me parecen menores.

Un enfoque alternativo para minimizar el lastre sintáctico es usar literales de cadena que incluyen nuevas líneas, pero 6.4.5 en el estándar C11 lo prohíbe, por lo que debe hablar amablemente con su compilador y pensar cuidadosamente sobre lo que hará.

PJTraill
fuente
3

Una razón no mencionada (a menos que me lo haya perdido) es que algunos programas CLI usarán '\ r' para actualizar repetidamente una línea. Por ejemplo, con estado.

La siguiente línea requerirá una nueva línea para llevar el cursor a, bueno, la siguiente (nueva) línea.

Otro ejemplo (muy malo) es cuando el programador es consciente de que varios programas pueden estar escribiendo en el mismo terminal. En este caso caótico, existe la posibilidad de que el orden '\ n' limpie el texto almacenado en búfer antes de escribir más y posiblemente codifique los resultados de las escrituras. Pero ese orden no está garantizado, y tarde o temprano el otro proceso irrumpirá y arruinará las cosas. ¡No hagas esto en nada que quieras mostrarle a tu madre!

Trataría de mantener el ejemplo anterior para propósitos de depuración, y no someter a los usuarios que no sean usted a los resultados. Esto se aplicaría con múltiples tareas no sincronizadas que también se escriben en el mismo archivo (con suerte de depuración).

Sin embargo, el caso de usar '\ r' para escribir sobre una línea de texto en la pantalla no es tan raro en el mundo de la CLI.

Las cosas pasan, después de todo.

Hugh Buntu
fuente