94 votes

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

Donc, j'ai finalement lu à travers K&R et j'ai appris quelque chose dès les premières pages, à savoir qu'il existe un caractère d'échappement de retour en 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");
}

Le résultat est

hello wodl

Quelqu'un peut-il expliquer cela ?

136voto

T.J. Crowder Points 285826

Votre résultat variera en fonction du type de terminal ou de programme de console que vous utilisez, mais oui, dans la plupart des cas \b est un non destructif backspace. Il déplace le curseur vers l'arrière, mais n'efface pas ce qui s'y trouve.

Ainsi, pour le hello worl le code sort

hello worl
          ^

...(où ^ montre l'endroit où se trouve le curseur) Puis il sort deux \b caractères qui déplacent le curseur en arrière de deux places sans l'effacement (sur votre terminal) :

hello worl
        ^

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

hello wodl
         ^

Enfin, il produit \n qui est un saut de ligne non destructif (encore une fois, sur la plupart des terminaux, y compris apparemment le vôtre), de sorte que la commande l est laissé inchangé et le curseur est déplacé au début de la ligne suivante.

121voto

pmg Points 52636
..........
^ <= 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

44voto

Peter K. Points 3837

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

"\b \b"

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

8voto

Nemo Points 32838

Pas trop difficile à expliquer... C'est comme taper hello worl en appuyant deux fois sur la touche flèche gauche, en tapant d et appuyez sur la touche flèche vers le bas.

Du moins, c'est ainsi que j'en déduis que votre terminal interprète l'information. \b y \n codes.

Redirigez la sortie vers un fichier et je parie que vous obtiendrez quelque chose d'entièrement différent. Bien que vous devrez peut-être regarder les octets du fichier pour voir la différence.

[modifier]

Pour développer un peu, ceci printf émet une séquence d'octets : hello worl^H^Hd^J , donde ^H est le caractère ASCII n° 8 et ^J est le caractère ASCII n° 10. Ce que vous voyez sur votre écran dépend de la façon dont votre terminal interprète ces codes de contrôle.

1voto

Dorothea Points 31

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X