Ответ 1
Пусть написано
char c[] = "abc\012\0x34";
с одиночными символами:
char c[] = { 'a', 'b', 'c', '\012', '\0', 'x', '3', '4', '\0' };
Первый \0
, который вы видите, - это начало восьмеричной escape-последовательности \012
, которая распространяется на следующие восьмеричные цифры.
Октальные escape-последовательности указаны в разделе 6.4.4.4 стандарта (проект N1570):
восьмеричное-спусковое последовательность:
\
восьмеричная цифра
\
восьмеричная восьмеричная цифра
\
восьмеричная восьмеричная восьмеричная цифра
они состоят из обратного слэша, за которым следуют одна, две или три восьмеричные цифры. В параграфе 7 этого раздела приводится степень восьмеричных и шестнадцатеричных escape-последовательностей:
7 Каждая восьмеричная или шестнадцатеричная escape-последовательность - это самая длинная последовательность символов, которая может представляют собой escape-последовательность.
Обратите внимание, что хотя длина восьмеричной escape-последовательности ограничена не более чем тремя восьмеричными цифрами (таким образом, "\123456"
состоит из пяти символов, { '\123', '4', '5', '6', '\0' }
), шестнадцатеричные escape-последовательности имеют неограниченную длину
шестнадцатеричное-спусковое последовательность:
\x
шестнадцатеричная цифра
шестнадцатеричная шестнадцатеричная шестнадцатеричная последовательность
и, следовательно, "\x123456789abcdef"
состоит только из двух символов ({ '\x123456789abcdef', '\0' }
).