strlen函数如何内部工作?

18

strlen()函数内部是如何工作的?该函数中是否存在任何固有的错误?

1个回答

59

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字符串(带长度)以及两者的组合——空终止的Pascal字符串。

虽然他还使用了更多丰富的术语来称呼这个最终类型,但每当我想到Python的优秀(完全无关的)f-strings时,他的这种说法总是浮现在脑海中 :-)


(a) C字符串被定义为一系列非终止字符(任何字符\0)后跟一个终止符号。因此,该定义禁止序列内嵌终止符号,并禁止没有此类终止符号的序列。或者,更简洁地说(根据ISO C标准):

字符串是由包括第一个空字符及其之前的一系列字符组成的字符串。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接