Ответ 1
strlen
обычно работает путем подсчета символов в строке до тех пор, пока не будет найден символ \0
. Каноническая реализация:
size_t strlen (char *str) {
size_t len = 0;
while (*str != '\0') {
str++;
len++;
}
return len;
}
В функции нет встроенной ошибки, она работает точно так же, как и документально.
Это не значит, что у него нет проблем, а именно:
- если вы передадите ему строку, в конце которой нет
\0
, вы можете столкнуться с проблемами, но технически, это не строка C (a) а ваша собственная ошибка. - вы не можете поместить символы
\0
в свою строку, но, опять же, в этом случае это не будет строка C. - Это не самый эффективный способ - вы можете сохранить длину спереди, чтобы вы могли быстрее получить длину.
Но ни один из них не является ошибкой, это просто последствия дизайнерского решения.
См. также эту замечательную статью Joel Spolsky, где он обсуждает различные строковые форматы и их характеристики, включая обычные строки C, строки Pascal и комбинацию из двух, null завершенные строки Паскаля, хотя у него есть еще, скажем так, "красочный" термин для них: -)
(a) Строка C определяется как ряд символов без терминатора (т.е. любой другой, чем \0
), за которым следует этот терминатор. Следовательно, это определение запрещает как встроенные терминаторы в последовательности и последовательностях без такого терминатора.
Или, поместив его более лаконично (согласно стандарту ISO):
Строка представляет собой непрерывную последовательность символов, заканчивающихся и включающих первый нуль характер.