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?
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.
.......... ^ <= 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
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.
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.
utilisez un seul espace arrière après chaque caractère
printf("hello wor\bl\bd\n");