Das “Backspace”-Escape-Zeichen ‘\b’: unerwartetes Verhalten?

Lesezeit: 4 Minuten

Benutzeravatar von OregonTrail
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?

Benutzeravatar von TJ Crowder
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

Benutzeravatar von Nemo
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.

Benutzeravatar von Dorothea
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.

    – Yolomep

    24. September 2020 um 16:06 Uhr

1422370cookie-checkDas “Backspace”-Escape-Zeichen ‘\b’: unerwartetes Verhalten?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy