c language-agnostic printf special-characters backspace

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