El carácter de escape "backspace" ''/ b'': comportamiento inesperado?
language-agnostic printf (5)
El resultado variará según el tipo de terminal o programa de consola en el que se encuentre, pero sí, en la mayoría de /b
hay un retroceso no destructivo . Mueve el cursor hacia atrás, pero no borra lo que está allí.
Entonces, para la parte hello worl
, las salidas del código
hello worl ^
... (donde ^
muestra dónde está el cursor) Luego, emite dos /b
caracteres que mueven el cursor hacia atrás dos lugares sin borrar (en su terminal):
hello worl ^
Tenga en cuenta que el cursor ahora está en la r
. Luego emite d
, que sobrescribe el r
y nos da:
hello wodl ^
Finalmente, produce /n
, que es una línea nueva no destructiva (nuevamente, en la mayoría de los terminales, incluido aparentemente el suyo), por lo que el l
se deja sin cambios y el cursor se mueve al comienzo de la siguiente línea.
Así que finalmente estoy leyendo K&R , y aprendí algo en las primeras páginas, que hay un carácter de escape de retroceso, /b
.
Así que voy a probarlo, y hay un comportamiento muy extraño:
#include <stdio.h>
main ()
{
printf("hello worl/b/bd/n");
}
El resultado es
hello wodl
¿Alguien puede explicar esto?
No es demasiado difícil de explicar ... Esto es como escribir hello worl
, presionar la tecla de flecha izquierda dos veces, escribir d
y presionar la tecla de flecha hacia abajo.
Al menos, así es como deduzco que tu terminal está interpetando los códigos /b
y /n
.
Redirige la salida a un archivo y apuesto a que obtienes algo completamente diferente. Aunque es posible que tenga que mirar los bytes del archivo para ver la diferencia.
[editar]
Para elaborar un poco, este 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 interpreta esos códigos de control.
Si quieres un retroceso destructivo, necesitarás algo como
"/b /b"
es decir, un retroceso, un espacio y otro retroceso.
Use un solo retroceso después de cada caracter printf("hello wor/bl/bd/n");
.......... ^ <= pointer to "print head"
/* part1 */
printf("hello worl");
hello worl ^ <= pointer to "print head"
/* part2 */
printf("/b");
hello worl ^ <= pointer to "print head"
/* part3 */
printf("/b");
hello worl ^ <= pointer to "print head"
/* part4 */
printf("d/n");
hello wodl ^ <= pointer to "print head" on the next line