Verwendung von \b und \r in C

Lesezeit: 4 Minuten

\b und \r kommen in der Praxis kaum zum Einsatz. Ich habe gerade herausgefunden, dass ich diese beiden Escape-Sequenzen falsch verstanden habe. Ein einfacher Test:

printf("foo\bbar\n");

Ich habe erwartet, dass es ausgegeben wird fobarWeil \b wird den Cursor zurücksetzen, und b wird die zweite überschreiben oaber stattdessen gibt es aus: foobar

Das gleiche ist mit \r:

printf("foo\rbar\n");

ich dachte \r bewegt den Cursor an den Anfang der aktuellen Zeile, also bar wird ersetzen fooso sollte die endgültige Ausgabe sein bar. Es gibt jedoch tatsächlich Folgendes aus:

foo
bar

  • Wo ist die Frage?

    – Chris

    21. Juni 2013 um 13:19 Uhr

  • auf welcher plattform bist du?

    – Verdächtiger

    21. Juni 2013 um 13:20 Uhr

  • @Chris was tut \b und \r genau machen?

    – Yu Hao

    21. Juni 2013 um 13:20 Uhr


  • stackoverflow.com/questions/6792812/…

    – ktn

    21. Juni 2013 um 13:21 Uhr

  • @YuHao Sie tun nichts. Sie sind nur Charaktere. Aber was auch immer Sie diese Zeichen schreiben, kann sich auf eine bestimmte Weise verhalten, wenn es diese Zeichen empfängt. zB wenn Sie diese Zeichen in eine Datei schreiben, landet das Zeichen in der Datei. Wenn Sie es an ein Terminal/eine Konsole schreiben, löscht das Terminal möglicherweise ein Zeichen, wenn es das \b sieht. Einige Terminals würden das tun, andere nicht.

    – Nr

    21. Juni 2013 um 13:22 Uhr


Die Zeichen werden einfach so an das zugrunde liegende Ausgabegerät (in Ihrem Fall wahrscheinlich ein Terminalemulator) gesendet.

Es liegt dann an der Implementierung des Terminals, wie diese Zeichen tatsächlich angezeigt werden. Zum Beispiel eine Glocke (\a) kann bei manchen Terminals einen Piepton auslösen, bei anderen ein Aufblitzen des Bildschirms oder wird komplett ignoriert. Es hängt alles davon ab, wie das Terminal konfiguriert ist.

  • Weißt du, wie man meine so konfiguriert, dass sie die Klingel (\a) nicht ignoriert?

    – mf_

    21. Juni 2013 um 13:42 Uhr

Die Charaktere sind genau wie dokumentiert – \b entspricht einem Zeichencode von 0x08 und \r entspricht 0x0d. Die Sache, die variiert, ist, wie Ihr Betriebssystem auf diese Zeichen reagiert. Damals, als Displays versuchten, einen alten Fernschreiber zu emulieren, waren diese Aktionen standardisiert, aber sie sind in modernen Umgebungen weniger nützlich und die Kompatibilität ist nicht garantiert.

  • Der Standard sagt nicht, was die Zeichencodes sind. \b wird sein 0x08 nur wenn 0x08 entspricht dem Backspace-Zeichen im Ausführungszeichensatz (was in ASCII und Unicode und anderen gängigen Zeichensätzen gilt). Wenn Ihr Ausführungszeichensatz jedoch EBCDIC ist, dann \b wird abbilden \0x16 (wenn ich den Zeichentabellen vertrauen kann, die ich online finde).

    – Adrian McCarthy

    21. Juni 2013 um 17:55 Uhr

Die Interpretation der Backspace- und Carriage-Return-Zeichen bleibt der Software überlassen, die Sie für die Anzeige verwenden. Ein Terminal-Emulator bewegt den Cursor bei der Anzeige von \b einen Schritt zurück und bei der Anzeige von \r an den Anfang der Zeile. Wenn Sie diese Zeichen woanders drucken, z. B. in einer Textdatei, kann die Software dies auswählen. etwas anderes zu tun.

Was die Bedeutung jedes in C Primer Plus beschriebenen Zeichens betrifft, haben Sie eine „richtige“ Antwort erwartet. Es sollte für einige Computerarchitekturen und Compiler gelten, aber leider nicht für Ihre.

Ich habe ein einfaches C-Programm geschrieben, um Ihren Test zu wiederholen, und habe diese “richtige” Antwort erhalten. Ich habe Mac OS und gcc verwendet.
Geben Sie hier die Bildbeschreibung ein

Außerdem bin ich sehr neugierig, welchen Compiler Sie verwendet haben. 🙂

Benutzeravatar von Moh K
Moh K

Ich habe viele der Backslash-Escape-Zeichen ausprobiert. \n Das ist ein neuer Zeilenvorschub, der überall platziert werden kann, um den Effekt zu erzielen. Eine wichtige Sache, die Sie bei der Verwendung dieses Zeichens beachten sollten, ist, dass das Betriebssystem des von uns verwendeten Computers die Ausgabe beeinflussen kann. Als Beispiel habe ich eine Reihe von Escape-Zeichen gedruckt und das Ergebnis wie folgt angezeigt, um zu beweisen, dass das Betriebssystem die Ausgabe beeinflusst.

Code:

#include <stdio.h>
int main(void){
    printf("Hello World!");
    printf("Goodbye \a");
    printf("Hi \b");
    printf("Yo\f");
    printf("What? \t");
    printf("pewpew");
    return 0;
}

eN5Z6
noRvg

  • Codes sollten Text sein, Sie können Bilder für die Ausgabe einfügen, die hier offensichtlich nicht gepostet werden können, da sie nicht wie auf lokalen Computern angezeigt werden

    – Morse

    26. April 2018 um 23:24 Uhr


Benutzeravatar von sepideha
Sepideha

In verschiedenen Compilern verhalten sich Backslash-Escape-Zeichen unterschiedlich.

Unter MAC OS mit Clang \b entfernt das letzte Zeichen von der Konsole, wie Sie es erwartet haben.

#include <iostream>
int main ()
{
  std::cout << "Test";
  std::cout << "\b";
  std::cout << "\n";
  return 0;
}

Ausgang:

 Tes

  • Codes sollten Text sein, Sie können Bilder für die Ausgabe einfügen, die hier offensichtlich nicht gepostet werden können, da sie nicht wie auf lokalen Computern angezeigt werden

    – Morse

    26. April 2018 um 23:24 Uhr


1410020cookie-checkVerwendung von \b und \r in C

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

Privacy policy