No puedo entender la salida de la cadena C++ con caracteres especiales

No puedo entender la salida de la cadena C++ con caracteres especiales

Esto se reduce a su terminal. Podemos ver fácilmente desde una plataforma que no representa el carácter de control '\b' de alguna manera especial que esté presente en la cadena en la ubicación esperada:

Entonces, ¿por qué no "borra" el 2 ?

Si abrimos cmd.exe y escribimos A , B , Ctrl +H luego vemos el B se borra inmediatamente. Esto parecería refutar la noción de que cmd.exe maneja el retroceso "no destructivamente" como lo hacen muchas consolas.

¡Pero no lo desmiente! Esto parece ser un manejo especial para las pulsaciones de teclas, presumiblemente vinculado a cómo funciona el carácter de retroceso real. Después de todo, desea que el carácter de retroceso borre cosas, en lugar de simplemente mover el cursor.

cmd.exe trata el carácter de control de forma diferente cuando se encuentra en una salida no generada por el teclado:de forma no destructiva. Por lo tanto, mueve el cursor hacia atrás y luego el siguiente carácter "sobrescribe" el carácter borrado.

Pero en el grupo 4, tiene una nueva línea, por lo que el siguiente carácter va en la siguiente línea y no está en el lugar correcto para borrar nada.

Podemos reproducir esto sin C++, construyendo un archivo especial y luego instruyendo a cmd.exe para que lo imprima:

"Trabajando"

"No funciona"

(Puede insertar el carácter especial ASCII 08 en Notepad++, utilizando el elemento de menú "Editar"/"Panel de caracteres").

Mi conclusión es no confiar en los códigos de control para tales "trucos":si desea eliminar un carácter de una cadena, hágalo; si desea crear una GUI, hágalo o simule una con una biblioteca inteligente como ncurses .


Lo que muestra la consola es la salida correcta, es decir

Group 4 output:
012
56789

Te equivocas al esperar

Group 4 output:
01
56789

Qué \b lo que hace el personaje es mover el cursor un carácter hacia atrás, no bórralo. Entonces, lo que sucedió es que el cursor se movió nuevamente a 2 pero el personaje todavía está allí.

012
  ^

El siguiente carácter \n no es un carácter imprimible sino un carácter de control y simplemente mueve el cursor a la siguiente línea para que no sobrescriba el carácter que ya se imprimió.

Si haces esto en su lugar:

//This is group 4
numString[3] = '\b';
numString[4] = 'X';
cout << "Group 4 output:\n" << numString << endl;

Ahora \b se mueve a 2 pero el siguiente carácter 'X' inmediatamente sobrescribe dando el siguiente resultado como se esperaba.

Group 4 output:
01X56789

Otra demostración es incluso si agrega otro retroceso:

numString[3] = '\b';
numString[4] = '\b';
numString[5] = '\n';

El cursor está ahora en 1

012
 ^

Ahora se encuentra con el \n (nueva línea) como el siguiente carácter y simplemente mueve el cursor a la siguiente línea para que 1 y 2 nunca se sobrescriban, ya que ya se imprimieron y permanecen ahora en el anterior línea.

El resultado ahora es, como se esperaba:

Group 4 output:
012
6789

Ver también esto y aquello