Ответ 1
Это не имеет ничего общего с printf
. В стандарте C11 перечислены escape-последовательности в п. 5.2.2, а список состоит из \a
, \b
, \f
, \n
, \r
, \t
и \v
. В качестве расширения GCC считает, что \e
является escape-последовательностью, которая обозначает символ ASCII Esc (\e
может работать также, или ваш компилятор не может поддерживать ни один из них. Обратитесь к документации для вашего компилятора). Ниже приведены не переносимые управляющие последовательности. Они не гарантированно работают одинаково во всех терминалах или даже работают вообще. Лучший способ узнать - это ознакомиться с документацией для вашей системы.
В §6.4.4.4 также описываются восьмеричные escape-последовательности. Например, \033
, где 033
является 27
в десятичной форме, а значит, escape-символом в ASCII. Аналогично, вы можете использовать \x1b
, который представляет собой шестнадцатеричную escape-последовательность, задающую один и тот же символ.
Если мы проверяем вывод программы с помощью od -c
, она показывает 033
.
(✿´‿`) ~/test> ./a.out | od -c
0000000 033 [ 0 m 033 [ ? 2 5 l 033 [ 2 J
0000016
Управляющие последовательности ANSI интерпретируются эмуляторами терминала. C преобразует восьмеричные escape-последовательности восьмеричного кода в символ ASCII Esc. Ваш компилятор, как расширение, может также преобразовать \e
или \e
. В соответствии с просьбой, краткое объяснение того, что выполняют управляющие последовательности:
-
[0m
: сбрасывает все атрибуты SGR -
[?25l
: скрывает курсор -
[2J
: из Википедии:Очищает часть экрана. Если
n
равно 0 (или отсутствует), очистить от курсора до конца экрана. Еслиn
равно 1, очистить от курсора до начала экран. Еслиn
равно 2, очистите весь экран...