Seu resultado irá variar dependendo do tipo de terminal ou programa de console em que você estiver, mas sim, na maioria \b
é um backspace não destrutivo . Ele move o cursor para trás, mas não apaga o que está lá.
Então, para a hello worl
parte, as saídas de código
olá mundo
^
... (onde ^
mostra onde o cursor está) Em seguida, ele produz dois \b
caracteres que movem o cursor dois lugares para trás sem apagar (em seu terminal):
olá mundo
^
Observe que o cursor está agora no r
. Em seguida, ele produz d
, que substitui o r
e nos dá:
olá wodl
^
Finalmente, ele produz \n
, que é uma nova linha não destrutiva (novamente, na maioria dos terminais, incluindo aparentemente o seu), de forma que o l
permanece inalterado e o cursor é movido para o início da próxima linha.
r
é substituído pord
. A explicação ainda se encaixa.cmd.exe
ecommand.com
nem sempre são inseridos (você pode usar a tecla Ins para alternar o comportamento). Fiquei surpreso ao descobrir que o Terminal Gnome no meu computador * nix principal sempre insere, nem parece ter uma preferência por isso, muito menos alternar com base na chave Ins. Nunca percebi isso antes. É claro que quase nunca quero datilografia. :-)fonte
'\n'
não tem representação na tela. O que já está lá permanece o mesmo; não substituído por um espaço ou qualquer outra representação de caractere.Se você quiser um retrocesso destrutivo, você precisará de algo como
ou seja, um backspace, um espaço e outro backspace.
fonte
\b
significará que o próximo caractere de saída o substituirá.0x7f
), estou perplexo.Não é muito difícil de explicar ... Isso é como digitar
hello worl
, pressionar a tecla de seta para a esquerda duas vezes, digitard
e pressionar a tecla de seta para baixo.Pelo menos, é assim que deduzo que seu terminal está interpretando os códigos
\b
e\n
.Redirecione a saída para um arquivo e aposto que você obterá algo totalmente diferente. Embora você possa ter que olhar os bytes do arquivo para ver a diferença.
[editar]
Para elaborar um pouco, isso
printf
emite uma sequência de bytes:,hello worl^H^Hd^J
onde^H
é o caractere ASCII # 8 e^J
é o caractere ASCII # 10. O que você vê em sua tela depende de como seu terminal interpreta esses códigos de controle.fonte
Use um único backspace após cada caractere
printf("hello wor\bl\bd\n");
fonte