El carácter de escape “backspace” ‘\ b’: comportamiento inesperado?

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  main () { printf("hello worl\b\bd\n"); } 

El resultado es

 hello wodl 

¿Alguien puede explicar esto?

El resultado variará según el tipo de terminal o progtwig 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

 hola mundo
           ^

… (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):

 hola mundo
         ^

Tenga en cuenta que el cursor ahora está en la r . Luego emite d , que sobrescribe el r y nos da:

 hola 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.

  ..........
 ^ <= puntero a "cabeza de impresión" 
  /* part1 */ printf("hello worl"); 
  hola mundo
           ^ <= puntero a "cabeza de impresión" 
  /* part2 */ printf("\b"); 
  hola mundo
          ^ <= puntero a "cabeza de impresión" 
  /* part3 */ printf("\b"); 
  hola mundo
         ^ <= puntero a "cabeza de impresión" 
  /* part4 */ printf("d\n"); 
  hola wodl

 ^ <= puntero a "cabeza de impresión" en la siguiente línea 

Si quieres un retroceso destructivo, necesitarás algo como

 "\b \b" 

es decir, un retroceso, un espacio y otro retroceso.

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.

Use un solo retroceso después de cada caracter printf("hello wor\bl\bd\n");