Почему я должен использовать \ x1b not \ для обозначения escape-символа - PullRequest
0 голосов
/ 24 мая 2019

Я читал, что \x1b представляет собой escape-символ, но не является ли '\' само по себе escape-символом? Учебник хочет, чтобы я написал

write(STDOUT_FILENO, "\x1b[2J", 4);

чтобы очистить экран. Почему '\[2J' не делает работу?

1 Ответ

0 голосов
/ 24 мая 2019

Чтобы немного уточнить комментарии Кена и Джонатана: побег здесь - это общая концепция.Это в основном подразумевает изменение интерпретации чего-либо.Экранирующий символ в ASCII происходит от машин телетайпа, где появление ESC изменило толкование следующего символа.Он одинаково используется многими терминалами.Например, появление ESC перед строкой [2J приводит к тому, что строка (т. Е. Символы [, 2 и J) не отображаются на терминале, а интерпретируются каккоманда " очистить весь экран ".Таким образом, escape-символ изменил интерпретацию mode .

Однако прямого способа ввода ASCII-символа не существует (поскольку нажатие клавиши ESC на клавиатуре обычно меняет режим вваш редактор, терминал или что-то еще), и даже если вы можете, разрешенный набор символов языка C не включает его.Теперь вам нужен второй уровень побега: C имеет собственный символ для побега: \.Это меняет значение следующего символа (ов).Например, обратный слеш прецедента изменяет значение (интерпретацию) следующего символа n на новую строку.Кроме того, \x (или \0 соответственно) позволяет синтаксическому анализатору C интерпретировать следующие два (три) символа как шестнадцатеричное (восьмеричное) число - вместо самих символов - и вставлять символ, соответствующий этому самому кодучисло.Поскольку код ASCII для escape имеет номер 27 (десятичный) или 1b (шестнадцатеричный) или 33 (восьмеричный) соответственно, вы генерируете управляющий символ ASCII в C на \x1b или \033.

Другими словами, вы сбегаете в C с помощью \, чтобы сгенерировать escape-символ ASCII, который, в свою очередь, вызывает экранирование на вашем терминале.

...