Das “Backspace”-Escape-Zeichen ‘\b’: unerwartetes Verhalten?
Lesezeit: 4 Minuten
OregonTrail
Also lese ich endlich durch K&Rund ich habe auf den ersten paar Seiten etwas gelernt, dass es ein Backspace-Escape-Zeichen gibt, \b.
Also gehe ich, um es auszuprobieren, und es gibt ein sehr seltsames Verhalten:
#include <stdio.h>
main ()
{
printf("hello worl\b\bd\n");
}
Die Ausgabe ist
hello wodl
Kann das jemand erklären?
TJ Crowder
Ihr Ergebnis hängt davon ab, auf welcher Art von Terminal- oder Konsolenprogramm Sie sich befinden, aber ja, auf den meisten \b ist ein zerstörungsfrei Rücktaste. Es bewegt den Cursor rückwärts, löscht aber nicht, was dort ist.
Also für die hello worl Teil, die Codeausgaben
hello worl
^
…(wo ^ zeigt, wo sich der Cursor befindet) Dann gibt es zwei aus \b Zeichen, wodurch der Cursor um zwei Stellen zurückbewegt wird ohne Löschen (auf Ihrem Endgerät):
hello worl
^
Beachten Sie, dass sich der Cursor jetzt auf befindet r. Dann gibt es aus ddie die überschreibt r und gibt uns:
hello wodl
^
Schließlich gibt es aus \nwas ein nicht destruktiver Zeilenumbruch ist (wiederum auf den meisten Terminals, einschließlich anscheinend Ihres), also die l bleibt unverändert und der Cursor springt an den Anfang der nächsten Zeile.
Wenn es nicht gelöscht wird, warum ist dann das “r” weg?
– cesoid
18. Mai 2016 um 14:04 Uhr
@cesoid: “Ihr Ergebnis hängt davon ab, auf welcher Art von Terminal- oder Konsolenprogramm Sie sich befinden.”
– TJ Crowder
18. Mai 2016 um 14:06 Uhr
@cesoid Die r wird durch ersetzt d. Die Erklärung passt trotzdem.
– Syockit
10. Juni 2016 um 1:21 Uhr
@syockit Danke. Ich wusste nicht, dass der Cursor “auf” dem Charakter war. Ich denke immer an Textverarbeitungsprogramme, wo sie es “zwischen” Zeichen zeigen (oder Terminalfenster, wo es immer eingefügt und nicht überschrieben wird). Die bearbeitete Erklärung macht dies deutlich.
– cesoid
10. Juni 2016 um 14:21 Uhr
@cesoid: Interessant über das Terminal. Unter Windows ist die cmd.exe und command.com Terminals werden nicht immer eingefügt (Sie können die Einfg-Taste verwenden, um das Verhalten umzuschalten). Ich war überrascht, dass Gnome Terminal auf meinem Hauptcomputer * nix immer einfügt, scheint nicht einmal eine Vorliebe dafür zu haben, geschweige denn umzuschalten basierend auf der Einfg-Taste. Ist mir vorher nie aufgefallen. Natürlich möchte ich fast nie Typover. 🙂
– TJ Crowder
10. Juni 2016 um 14:25 Uhr
..........
^ <= 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
Wenn der Cursor nach Teil 4 auf dem Buchstaben „l“ steht, sollte er nicht durch das „\n“ ersetzt werden? (was zu “Hallo wor” führt)
– lucas_turci
6. September 2016 um 13:31 Uhr
@lucas_turci: Die Sache ist, dass die '\n' hat keine Darstellung auf dem Bildschirm. Was schon da ist, bleibt gleich; nicht durch ein Leerzeichen oder eine andere Zeichendarstellung ersetzt.
– pmg
6. September 2016 um 13:47 Uhr
Wenn Sie eine destruktive Rücktaste wollen, brauchen Sie so etwas wie
"\b \b"
dh eine Rücktaste, ein Leerzeichen und noch eine Rücktaste.
Das lässt immer noch das Leerzeichen, oder?
– Schrittmacher
14. Mai 2014 um 20:54 Uhr
Nun ja, aber das Folgende \b bedeutet, dass das nächste Ausgabezeichen es überschreiben wird.
– PeterK.
15. Mai 2014 um 1:53 Uhr
Was ist, wenn es eine gibt nein nachfolgendes Zeichen?
– Schrittmacher
18. Mai 2014 um 17:00 Uhr
Dann spielt es keine Rolle, oder?
– PeterK.
18. Mai 2014 um 21:48 Uhr
Hmm. Sofern Ihr Gerät keine „Letztes Zeichen löschen“-Option implementiert (z. B. DEL / 0x7f), ich bin ratlos.
– PeterK.
19. Mai 2014 um 16:49 Uhr
Nemo
Nicht zu schwer zu erklären … Das ist wie Tippen hello worlzweimal die linke Pfeiltaste drücken, tippen dund drücken Sie die Pfeiltaste nach unten.
Zumindest schließe ich daraus, dass Ihr Terminal das interpretiert \b und \n Codes.
Leiten Sie die Ausgabe in eine Datei um und ich wette, Sie erhalten etwas ganz anderes. Möglicherweise müssen Sie sich jedoch die Bytes der Datei ansehen, um den Unterschied zu erkennen.
[edit]
Um es ein wenig zu vertiefen, dies printf gibt eine Folge von Bytes aus: hello worl^H^Hd^Jwo ^H ist ASCII-Zeichen #8 und ^J ist das ASCII-Zeichen Nr. 10. Was Sie auf Ihrem Bildschirm sehen, hängt davon ab, wie Ihr Terminal diese Steuercodes interpretiert.
Dorothee
Verwenden Sie nach jedem Zeichen eine einzelne Rücktaste printf("hello wor\bl\bd\n");
“Hallo wod\n”? Was bedeutet das?
– Elias Hasle
29. Januar 2019 um 7:53 Uhr
Der Antwortende möchte nur zeigen, wie das vom OP erwartete Verhalten erzeugt wird.
– Yolomep
24. September 2020 um 16:06 Uhr
“Hallo wod\n”? Was bedeutet das?
– Elias Hasle
29. Januar 2019 um 7:53 Uhr
Der Antwortende möchte nur zeigen, wie das vom OP erwartete Verhalten erzeugt wird.