Мне нужно преобразовать escape-последовательности, содержащиеся в не-литеральных строках (чтобы они разбивались на несколько символов, первый из которых \
а остальные просто n
, r
или даже восьмеричные коды и т. д.) к фактическому символу, представленному этой escape-последовательностью.
Моей первой мыслью было, что это возможно с помощью макроса (например, #define to_escape(x) '\(x)'
что не работает), но мне интересно, есть ли на самом деле такой путь и есть ли лучшие способы.
Конечно, я мог бы использовать простой оператор switch для таких экранировок, как \a
, \f
и тому подобное, но как тогда я справлюсь со всеми восьмеричными и шестнадцатеричными побегами?
Вы можете пойти на это распределение байтов
\' single quote byte 0x27 in ASCII encoding
\" double quote byte 0x22 in ASCII encoding
\? question mark byte 0x3f in ASCII encoding
\\ backslash byte 0x5c in ASCII encoding
\a audible bell byte 0x07 in ASCII encoding
\b backspace byte 0x08 in ASCII encoding
\f form feed - new page byte 0x0c in ASCII encoding
\n line feed - new line byte 0x0a in ASCII encoding
\r carriage return byte 0x0d in ASCII encoding
\t horizontal tab byte 0x09 in ASCII encoding
\v vertical tab byte 0x0b in ASCII encoding
проверьте, совпадают ли их адреса с их гекса-адресами, и вы можете получить следующий символ.
Других решений пока нет …