Le caractère" backspace "escape' B': comportement inattendu?

donc je suis finalement en train de lire à travers K&R , et j'ai appris quelque chose dans les premières pages, qu'il y a un caractère d'évasion de backspace, b .

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

#include <stdio.h>

main ()
{
    printf("hello worlbbdn");
}

la sortie est

hello wodl

quelqu'un Peut-il expliquer cela?

76
demandé sur poke 2011-07-22 20:07:59

5 réponses

votre résultat variera selon le type de terminal ou de programme de console sur lequel vous êtes, Mais oui, sur la plupart \b est un non destructif backspace. Il déplace le curseur en arrière, mais n'efface pas ce qui est là.

donc pour la partie hello worl , le code sort

hello worl
          ^

...(où ^ indique où est le curseur) alors il affiche deux caractères \b qui déplacent le curseur en arrière deux places sans effacement (sur votre terminal):

hello worl
        ^

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

hello wodl
         ^

enfin, il sort \n , qui est une nouvelle ligne non-destructive (encore une fois, sur la plupart des terminaux, y compris apparemment le vôtre), de sorte que le l est laissé inchangé et le curseur est déplacé à la début de la ligne suivante.

116
répondu T.J. Crowder 2016-06-10 06:19:21
..........
^ <= 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
119
répondu pmg 2011-07-22 16:13:37

si vous voulez un backspace destructif, vous aurez besoin de quelque chose comme

"\b \b"

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

39
répondu Peter K. 2011-07-22 16:31:02

pas trop difficile à expliquer... C'est comme taper hello worl , frapper deux fois la touche Flèche gauche, taper d , et frapper la touche Flèche vers le bas.

du moins, c'est comme ça que je déduis que votre terminal interpelle les codes \b et \n .

Rediriger la sortie vers un fichier et je parie que vous obtenez quelque chose d'autre entièrement. Bien que vous pourriez avoir à regarder 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 le caractère ASCII #8 et ^J est le caractère ASCII #10. Ce que vous voyez sur votre écran dépend de la façon dont votre terminal interprète ces codes de contrôle.

8
répondu Nemo 2011-07-22 16:16:01

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

1
répondu Dorothea 2011-11-27 02:25:51