функция 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', '' }
).