Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What does printf("\033c" ) mean?

I was looking for a way to "reset" my Unix terminal window after closing my program, and stumbled upon printf("\033c" ); which works perfectly, but I just can't understand it. I went to man console_codes and since I'm somewhat inexperienced with Unix c programming, it wasn't very helpful.

Could someone explain printf("\033c" );?

like image 830
NUGA Avatar asked Nov 27 '17 03:11

NUGA


2 Answers

In C numbers starting with a leading zero are octal numbers. Numbers in base 8.

What it does is print the character represented by octal number 33 followed by a 'c'.

In ASCII encoding the octal number 33 is the ESC (escape) character, which is a common prefix for terminal control sequences.

With that knowledge searching for terminal control sequences we can find e.g. this VT100 control sequence reference (VT100 was an old "dumb" terminal, and is emulated by most modern terminal programs). Using the VT100 reference we find <ESC>c in the terminal setup section, where it's documented as

Reset Device <ESC>c

Reset all terminal settings to default.


The ESC character could also be printed using "\x1b" (still assuming ASCII encoding). There is no way to use decimal numbers in constant string literals, only octal and hexadecimal.

However (as noted by the comment by chux) the sequence "\x1bc" will not do the same as "\033c". That's because 0x1bc is a valid hexadecimal number, and the compiler is greedy when it parses such sequences. It will print the character represented by the value 0x1bc instead, and I have no idea what it might be (depends on locale and terminal settings I suppose, might be printed as a Unicode character).

like image 193
Some programmer dude Avatar answered Oct 13 '22 12:10

Some programmer dude


That's an escape sequence used to reset a DEC VT100 (or compatible) terminal. Some terminals (such as Linux console) accept VT100-style escape sequences, even when they are not actually VT100s.

The \033 is the ASCII escape character, which begins these sequences. Most are followed by another special character (this is a rare exception). XTerm Control Sequences lists that, along with others that are not followed by a special character.

In ECMA-48 it is possible to use a different character for the usual case, e.g., [ for the *control sequence initiator.

Resetting a real VT100 (in contrast to a terminal emulator) does more than clear the screen, as noted in Debian Bug report logs - #60377 "reset" broken for dumb terminals, but users of terminal emulators tend to assume it is a short way to clear the screen. The standard way would be something like this:

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

The ncurses FAQ Why does reset log me out? addresses that issue.

Incidentally, users of terminal emulators also get other issues with the terminal confused. The ncurses FAQ How do I get color with VT100? addresses one of those.

like image 7
Thomas Dickey Avatar answered Oct 13 '22 10:10

Thomas Dickey