Twój wynik będzie się różnić w zależności od rodzaju terminala lub programu konsoli, na którym się znajdujesz, ale tak, w większości przypadków \b
jest to nieniszczący backspace. Przesuwa kursor do tyłu, ale nie usuwa tego, co tam jest.
Tak więc w przypadku hello worl
części kod wyprowadza
witaj świecie
^
... (gdzie ^
pokazuje, gdzie jest kursor) Następnie wypisuje dwa \b
znaki, które przesuwają kursor do tyłu o dwa miejsca bez usuwania (na twoim terminalu):
witaj świecie
^
Zwróć uwagę, że kursor znajduje się teraz na r
. Następnie wypisuje d
, co nadpisuje r
i daje nam:
cześć wodl
^
Na koniec wyświetla \n
, co jest nieniszczącą nową linią (znowu na większości terminali, w tym najwyraźniej na twoim), więc l
pozostaje niezmieniona, a kursor jest przenoszony na początek następnej linii.
r
jest zastępowane przezd
. Wyjaśnienie wciąż pasuje.cmd.exe
acommand.com
terminale nie zawsze wstawić (można użyć klawisza Ins, aby włączyć zachowanie). Zaskoczyło mnie, że Terminal Gnome na moim głównym komputerze * nix zawsze wstawia, wydaje się, że nawet nie preferuje go, a tym bardziej przełączania na podstawie klucza Ins. Nigdy wcześniej tego nie zauważyłem. Najwyraźniej prawie nigdy nie chcę pisać na maszynie. :-)źródło
'\n'
nie ma reprezentacji na ekranie. To, co już jest, pozostaje takie samo; nie jest zastępowana spacją ani żadną inną reprezentacją znaku.Jeśli chcesz destrukcyjnego backspace, potrzebujesz czegoś takiego
tj. backspace, spacja i inny backspace.
źródło
\b
będzie oznaczał, że następny znak wyjściowy go nadpisze.0x7f
), jestem zaskoczony.Nie jest to zbyt trudne do wyjaśnienia ... To jest jak pisanie
hello worl
, dwukrotne naciśnięcie klawisza strzałki w lewo, pisanied
i naciskanie klawisza strzałki w dół.Przynajmniej tak wnioskowałem, że twój terminal interpretuje kody
\b
i\n
.Przekieruj wyjście do pliku, a założę się, że otrzymasz coś zupełnie innego. Chociaż być może będziesz musiał spojrzeć na bajty pliku, aby zobaczyć różnicę.
[edytować]
Aby trochę rozwinąć,
printf
emituje sekwencję bajtów:,hello worl^H^Hd^J
gdzie^H
jest znak ASCII nr 8, a^J
jest to znak ASCII nr 10. To, co widzisz na ekranie, zależy od tego, jak terminal interpretuje te kody kontrolne.źródło
Użyj jednego znaku cofnięcia po każdym znaku
printf("hello wor\bl\bd\n");
źródło