内部如何strlen()
运作?该功能是否存在任何固有错误?
问问题
52081 次
1 回答
55
strlen
通常通过计算字符串中的字符直到\0
找到一个字符来工作。一个规范的实现是:
size_t strlen (char *str) {
size_t len = 0;
while (*str != '\0') {
str++;
len++;
}
return len;
}
至于函数中可能存在的固有错误,没有 - 它完全按照文档说明工作。这并不是说它没有某些问题,也就是说:
- 如果你传递一个结尾没有 a 的“字符串”
\0
,你可能会遇到问题,但从技术上讲,这不是 C 字符串(a),这是你自己的错。 - 您不能
\0
在字符串中放置字符,但在这种情况下,它也不会是 C 字符串。 - 这不是最有效的方法 - 您可以预先存储一个长度,这样您就可以更快地获得长度。
但这些都不是错误,它们只是设计决策的结果。
关于最后一个要点,另请参阅Joel Spolsky 的这篇出色的文章,他在其中讨论了各种字符串格式及其特征,包括普通 C 字符串(带有终止符)、Pascal 字符串(带有长度)以及两者的组合,以空结尾帕斯卡字符串。
尽管他对最终类型有一个更“多彩”的术语,我们可以说,每当我提到 Python 的优秀(并且完全不相关)的 f 字符串时,它经常会浮现在脑海中 :-)
(a) AC 字符串定义为一系列非终止字符(除 之外的任何字符),\0
后跟一个终止符。因此,这个定义不允许序列中嵌入终止符,也不允许序列中没有这种终止符。或者,更简洁地说(根据 ISO C 标准):
字符串是由第一个空字符终止并包括第一个空字符的连续字符序列。
于 2010-11-09T10:56:41.540 回答