Подтвердить что ты не робот

Strlen - длина строки иногда увеличивается на 1

Я задаю несколько загадочных вопросов. В большинстве случаев я могу найти правильный ответ, но с этим у меня возникают проблемы. Я знаю правильный ответ, используя компилятор, но я не знаю причины.

Посмотрите на код:

char c[] = "abc\012\0x34";

Что возвратит strlen(c), используя стандартный компилятор C?

Мой компилятор возвращает 4, когда ожидалось 3.

То, что я подумал, strlen() будет искать первое вхождение символа NULL, но как-то результат - еще один, чем я ожидал.

Любая идея, почему?

4b9b3361

Ответ 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' }).