2014-11-30 5 views
10

von this code lesen, stieß ich auf die folgenden printf() Aussage:Confused mit interessanten printf() Anweisung

// reset, hide cursor and clear screen 
printf("\e[0m\e[?25l\e[2J"); 

ich, dass ich ein voll qualifizierter C Hacker bin nicht, und das nicht vollständig verstehen muss zugeben. Ich zwickte herum und entfernte die Argumente, und ich verstehe, was es tut (nun, der Kommentar sagt alles), aber ich habe keine Ahnung, wie es gemacht wird. Auch das ist etwas schwer zu googeln.

Wie funktioniert das printf() Anruf funktioniert?

+7

'man 5 termcap' oder' man5 terminfo' – wildplasser

+2

Aus 'printf()' 's Perspektive funktioniert es wie jede andere' printf() 'Anweisung: Es druckt eine Folge von' char's auf die Standardausgabe. Versuchen Sie, die Ausgabe des Programms in eine Datei umzuleiten und dann den Inhalt zu überprüfen. – alk

+0

möglich Duplikat [Reset-Bildschirm Punkt auf der Oberseite des Bildschirms in Windows & Linux-Konsole] (http://stackoverflow.com/questions/56324/reset-screen-point-to-the-top-of-screen-in- windows-linux-Konsole) – 2501

Antwort

11

Das hat eigentlich nichts mit printf zu tun. Der C11-Standard listet Escape-Sequenzen in §5.2.2 auf und die Liste besteht aus \a, \b, , \n, \r, \t und \v. Als Erweiterung betrachtet GCC\e als eine Escape-Sequenz, die für das ASCII-Zeichen Esc (\E funktioniert möglicherweise auch, oder Ihr Compiler unterstützt möglicherweise keine von ihnen. Siehe die Dokumentation für Ihren Compiler). Was folgt, sind nicht tragbar control sequences. Es ist nicht garantiert, dass sie in allen Terminals gleich funktionieren oder überhaupt funktionieren. Der beste Weg, dies zu wissen, ist die Dokumentation Ihres Systems zu konsultieren.

§6.4.4.4 beschreibt auch Oktal-Escape-Sequenzen. Beispiel: \033, wobei 03327 im Dezimalformat und daher das Escape-Zeichen in ASCII ist. Ähnlich können Sie \x1b verwenden, eine hexadezimale Escape-Sequenz, die dasselbe Zeichen angibt. Wenn wir die Ausgabe des Programms mit od -c überprüfen, zeigt es 033 an.

(✿´‿`) ~/test> ./a.out | od -c 
0000000 033 [ 0 m 033 [ ? 2 5 l 033 [ 2 J 
0000016 

Die ANSI-Escape-Sequenzen werden durch Terminalemulatoren interpretiert. C konvertiert die oktalen/hexadezimalen Escape-Sequenzen in das ASCII-Zeichen Esc. Ihr Compiler kann als Erweiterung auch \e oder \E konvertieren. Wie gewünscht, eine kurze Erklärung, was die Kontrollsequenzen tun:

  • [0m: Setzt alle SGR
  • [?25l Attribute: versteckt den Cursor
  • [2J: aus Wikipedia:

    Löscht einen Teil des Bildschirms. Wenn n 0 (oder nicht vorhanden) ist, löschen Sie den Cursor vom Cursor bis zum Ende des Bildschirms. Wenn n 1 ist, löschen Sie den Cursor vom Anfang des Bildschirms . Wenn n 2, klar gesamter Bildschirm ...

+0

Könnten Sie eine ausführlichere Erklärung hinzuzufügen, was genau der 'printf' Befehl in der Frage tut? –

+1

@Daniel Dort habe ich es bearbeitet. –

7

Der printf() Aufruf ist einfach eine bestimmte Reihe von Byte-Wert ausgibt. Die "Magie" ist, dass diese Werte im Terminal besonders sind.

Eine besondere Reihe von Bytes mit dem ASCII „escape“ Zeichen ist ein Ausgang „Escape-Sequenz“ bezeichnet. Diese wurden für serielle Datenendgeräte erfunden, bei denen die einzige Möglichkeit der Kommunikation mit dem Terminal durch das Senden von Byte-Werten über die serielle Verbindung bestand. Gewöhnliche Zeichen werden einfach auf dem Terminal angezeigt, aber es war wünschenswert, eine Möglichkeit zu haben, den Cursor zu bewegen, den Bildschirm zu löschen, usw., und die meisten Terminals verwendeten hierzu Escape-Sequenzen.

http://en.wikipedia.org/wiki/Escape_sequence

war es ein besonders beliebtes Terminal der "VT100" genannt, und die meisten Terminal heute Emulatoren arbeiten VT100-Escape-Sequenzen verwenden.

Auch heute Escape-Sequenzen nützlich sind. Sie können ein einfaches C-Programm schreiben, das auf den Terminalemulatoren in Linux, Mac, Windows, mobilen Geräten, grundsätzlich überall funktioniert. Wenn Sie etwas Einfaches wie den Bildschirm löschen müssen, ist die Ausgabe der richtigen Escape-Sequenz der einfachste Weg.