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