функция strlen - длина строки увеличивается на 1

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

взгляните на код:

char c[] = "abc2x34";

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

мой компилятор возвращает 4, когда то, что я ожидал, было 3.

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

есть идеи почему?

1 ответов


давай пиши

char c[] = "abc2x34";

С одиночных символов:

char c[] = { 'a', 'b', 'c', '2', '', 'x', '3', '4', '' };

первый вы видите, это начало восьмеричной escape-последовательности 2, который распространяется на следующие восьмеричные цифры.

Восьмеричные escape-последовательности указаны в разделе 6.4.4.4 стандарта (проект N1570):

восьмеричная-escape-последовательность:
\ восьмеричная-цифра
\ восьмеричная-цифра восьмеричная-цифра
\ восьмеричная-цифра восьмеричная-цифра восьмеричная-цифра

они состоят из обратной косой черты, за которой следует одна, две или три восьмеричные цифры. В пункте 7 этого раздела приводится степень восьмеричных и шестнадцатеричных escape-последовательностей:

7 каждая восьмеричная или шестнадцатеричная escape-последовательность-это самая длинная последовательность символов, которая может составляют последовательность.

обратите внимание, что в то время как длина восьмеричной escape-последовательности ограничена не более чем тремя восьмизначными цифрами (таким образом "3456" состоит из пяти символов, { '3', '4', '5', '6', '' }), шестнадцатеричные escape-последовательности имеют неограниченную длину

шестнадцатеричная escape-последовательность:
\x шестнадцатеричная-цифра
шестнадцатеричная escape-последовательность шестнадцатеричных цифр

и так "\x123456789abcdef" состоит только из двух символов ({ '\x123456789abcdef', '' }).