【问题标题】:How does the strlen function work internally?strlen 函数在内部是如何工作的?
【发布时间】:2011-05-07 04:18:58
【问题描述】:

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

【问题讨论】:

    标签: c strlen


    【解决方案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 的 this excellent article,他在其中讨论了各种字符串格式及其特征,包括普通 C 字符串(带终止符)、Pascal 字符串(带长度)以及两者的组合, 以 null 结尾的 Pascal 字符串。

    尽管他对最终类型有一个更“多彩”的术语,我们应该说,这个术语在我提到 Python 的优秀(并且完全不相关)的 f 字符串时经常会浮现在脑海中 :-)


    (a) C 字符串定义为一系列非终止符(\0 以外的任何字符other),后跟一个终止符。因此,这个定义不允许嵌入终止符序列中,也不允许序列没有这样的终止符。或者,更简洁地说(根据 ISO C 标准):

    字符串是由第一个空字符终止并包括第一个空字符的连续字符序列。

    【讨论】:

      猜你喜欢
      • 2020-05-07
      • 2018-03-07
      • 2022-12-29
      • 2015-11-25
      • 2020-08-06
      • 2019-02-01
      • 1970-01-01
      • 2018-12-15
      • 2013-02-13
      相关资源
      最近更新 更多