web-dev-qa-db-fra.com

Le caractère d'échappement "backspace" '\ b': comportement inattendu?

Donc, je lis enfin K & R , et j’ai appris quelque chose dans les premières pages, qu’il y avait un caractère d'échappement arrière, \b.

Je vais donc le tester, et il y a un comportement très étrange:

#include <stdio.h>

main ()
{
    printf("hello worl\b\bd\n");
}

La sortie est

hello wodl

Quelqu'un peut-il expliquer cela?

89
OregonTrail

Votre résultat variera en fonction du type de terminal ou de programme de console sur lequel vous êtes, mais oui, la plupart \b Est un non destructif retour arrière. Cela déplace le curseur en arrière, mais n'efface pas ce qu'il y a.

Donc, pour la partie hello worl, Le code sort

 bonjour le monde 
 ^ 

... (où ^ indique où se trouve le curseur) Ensuite, il génère deux caractères \b qui déplacent le curseur vers l’arrière de deux endroits sans effacement (sur votre terminal):

 bonjour le monde 
 ^ 

Notez que le curseur est maintenant sur le r. Puis il sort d, ce qui écrase le r et nous donne:

 hello wodl 
 ^ 

Enfin, il génère \n, Qui est une nouvelle ligne non destructive (là encore, sur la plupart des terminaux, y compris apparemment le vôtre), de sorte que l reste inchangé et que le curseur se place au début de la ligne suivante.

128
T.J. Crowder
.......... 
 ^ <= pointeur sur "tête d'impression"
            /* part1 */
            printf("hello worl");
salut world 
 ^ <= pointeur sur "tête d'impression"
            /* part2 */
            printf("\b");
salut world 
 ^ <= pointeur sur "tête d'impression"
            /* part3 */
            printf("\b");
salut world 
 ^ <= pointeur sur "tête d'impression"
            /* part4 */
            printf("d\n");
salut wodl 
 
 ^ <= pointeur sur "tête d'impression" sur la ligne suivante
119
pmg

Si vous voulez un retour arrière destructeur, vous aurez besoin de quelque chose comme

"\b \b"

c'est-à-dire un espace arrière, un espace et un autre espace arrière.

42
Peter K.

Pas trop difficile à expliquer ... C'est comme si vous tapiez hello worl, Appuyez deux fois sur la touche flèche gauche, tapez d et appuyez sur la touche flèche vers le bas.

Du moins, c’est comme ça que je suppose que votre terminal interpelle les codes \b Et \n.

Redirige la sortie vers un fichier et je parie que vous obtenez autre chose. Vous devrez peut-être consulter les octets du fichier pour voir la différence.

[modifier]

Pour élaborer un peu, ce printf émet une séquence d'octets: hello worl^H^Hd^J, Où ^H Est ASCII caractère # 8 et ^J Est ASCII caractère # 10. Ce que vous voyez sur votre écran dépend de la manière dont votre terminal interprète ces codes de contrôle.

8
Nemo

Utilisez un retour arrière unique après chaque caractère printf("hello wor\bl\bd\n");

1
Dorothea