2017-11-27 2 views
-1

Ich suchte nach einem Weg, um mein Unix-Terminal-Fenster nach dem Schließen meines Programms zu "zurücksetzen", und stolperte über printf("\033c");, was perfekt funktioniert, aber ich kann es einfach nicht verstehen. Ich ging zu man console_codes und da ich mit Unix c Programmierung etwas unerfahren bin, war es nicht sehr hilfreich.Was bedeutet printf (" 033c")?

Konnte jemand printf("\033c"); erklären?

Antwort

3

In C-Nummern beginnend mit einer führenden Null sind octal Zahlen. Zahlen in der Basis 8.

Was es tut, ist das Zeichen octal Nummer 33, gefolgt von einem 'c'.

In ASCII encoding die Oktalzahl 33 ist die ESC (escape) Zeichen, die ein gemeinsamer Präfix für die Terminal-Steuersequenzen ist.

Mit diesem Wissen, das nach terminalen Kontrollsequenzen sucht, können wir z.B. this VT100 control sequence reference (VT100 war ein altes "dummes" Terminal und wird von den meisten modernen Terminalprogrammen emuliert). Unter Verwendung des VT100 Referenz wir <ESC>c im Terminal-Setup-Sektion, wo es als

Gerät zurücksetzen <ESC>c

zurücksetzen alle Terminal auf die Standardeinstellungen dokumentiert wird.


Der ESC Charakter auch gedruckt werden kann unter Verwendung von "\x1b" (immer noch unter der Annahme, ASCII-Codierung). Es gibt keine Möglichkeit, Dezimalzahlen in konstanten String-Literalen zu verwenden, nur oktal und hexadezimal.

jedoch (wie durch the commend by chux angegeben) die Sequenz "\x1bc" wird nicht das gleiche tun wie "\033c". Das liegt daran, dass 0x1bc eine gültige hexadezimale Zahl ist und der Compiler gierig ist, wenn er solche Sequenzen analysiert. Es wird stattdessen das durch den Wert 0x1bc dargestellte Zeichen gedruckt, und ich habe keine Ahnung, was es sein könnte (hängt von den Gebietsschema- und Terminaleinstellungen ab, die ich vermute, könnte als ein Unicode-Zeichen gepriesen werden).

+0

Nun, ich glaube nicht, dass eine bessere Antwort existiert! Vielen Dank, dass Sie mir nicht nur etwas Neues beigebracht haben, sondern auch eine korrekte Antwort gegeben haben. – NUGA

+2

Minor: '" \ x1bc "' kann nicht das gleiche Ergebnis wie "\ 033c" ergeben, da die Hexadezimulation nicht eindeutig length limitiert ist. Kann '" \ x1b "" c "' – chux

+0

@chux Beweis verwenden, dass sogar Erfahrung nicht alles manchmal bedeutet. Und diese "Code" -Bewertungen * helfen *. :) –

0

Das eine Escape-Sequenz wird verwendet, um Reset einem DEC VT100 (oder ein kompatibles) -Anschluss. Einige Terminals (z. B. die Linux-Konsole) akzeptieren Escapesequenzen im VT100-Stil, auch wenn es sich nicht um VT100 handelt.

Die \033 ist das ASCII-Escape-Zeichen, das diese Sequenzen beginnt. Auf die meisten folgt ein anderes Sonderzeichen (dies ist eine seltene Ausnahme). XTerm Control Sequences listet diese zusammen mit anderen auf, denen kein spezielles Zeichen folgt.

In ECMA-48 ist es möglich, ein anderes Zeichen für den üblichen Fall zu verwenden, z. B. für den * Steuersequenzinitiator.

ein echte VT100 zurücksetzen (im Gegensatz zu einem Terminal-Emulator) ist mehr als auf den Bildschirm zu löschen, wie erwähnt in Debian Bug report logs - #60377 "reset" broken for dumb terminals, aber die Benutzer von Terminalemulatoren sind in der Regel davon ausgehen, es nur ein kurzer Weg ist, den Bildschirm zu löschen. Der normale Weg wäre so etwas wie dieses:

printf("\033[H\033[J"); 

Die ncurses FAQ Why does reset log me out? wird das Problem behoben.

Übrigens, Benutzer von Terminal-Emulatoren bekommen auch andere Probleme mit dem Terminal verwirrt. Die Ncurses FAQ How do I get color with VT100? Adressen einer dieser.

+0

Danke für Ihre Antwort! Mit der Antwort Ein Programmierer-Dude stellte das Terminal zur Verfügung, nachdem "clearing" auf halbem Weg statt in der oberen linken Ecke steckte, wie es sollte, und mein OCD trat ein, so dass ich bei "033c" bleiben musste. Aber Ihre tut das gleiche, ohne die möglichen Probleme, auf die Sie hingewiesen haben. – NUGA