16

内部如何strlen()运作?该功能是否存在任何固有错误?

4

1 回答 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 回答