Su resultado variará dependiendo del tipo de terminal o programa de consola en el que se encuentre, pero sí, en la mayoría \b
hay un retroceso no destructivo . Mueve el cursor hacia atrás, pero no borra lo que está allí.
Entonces, para la hello worl
parte, el código genera
hola mundo
^
... (donde ^
muestra dónde está el cursor) Luego genera dos \b
caracteres que mueven el cursor hacia atrás dos lugares sin borrar (en su terminal):
hola mundo
^
Tenga en cuenta que el cursor ahora está en r
. Luego sale d
, que sobrescribe el r
y nos da:
hola wodl
^
Finalmente, genera \n
, que es una nueva línea no destructiva (nuevamente, en la mayoría de las terminales, incluida aparentemente la suya), por lo que l
se deja sin cambios y el cursor se mueve al comienzo de la siguiente línea.
r
se reemplaza pord
. La explicación aún encaja.cmd.exe
ycommand.com
no siempre se insertan (puede usar la tecla Ins para alternar el comportamiento). Me sorprendió descubrir que Gnome Terminal en mi computadora principal * nix siempre se inserta, ni siquiera parece tener preferencia por él, y mucho menos alternar en función de la tecla Ins. Nunca lo había notado antes. Claramente, casi nunca quiero mecanografiar. :-)fuente
'\n'
no tiene representación en pantalla. Lo que ya está ahí permanece igual; no reemplazado por un espacio o cualquier otra representación de carácter.Si quieres un retroceso destructivo, necesitarás algo como
es decir, un retroceso, un espacio y otro retroceso.
fuente
\b
significará que el siguiente carácter de salida lo sobrescribirá.0x7f
), estoy perplejo.No es demasiado difícil de explicar ... Esto es como escribir
hello worl
, presionar la tecla de flecha izquierda dos veces, escribird
y presionar la tecla de flecha hacia abajo.Al menos, así es como infiero que su terminal está interpretando los códigos
\b
y\n
.Redirija la salida a un archivo y apuesto a que obtendrá algo completamente diferente. Aunque puede que tenga que mirar los bytes del archivo para ver la diferencia.
[editar]
Para elaborar un poco, esto
printf
emite una secuencia de bytes:,hello worl^H^Hd^J
donde^H
es el carácter ASCII # 8 y^J
es el carácter ASCII # 10. Lo que ve en su pantalla depende de cómo su terminal interprete esos códigos de control.fuente
Use un solo retroceso después de cada carácter
printf("hello wor\bl\bd\n");
fuente