C strlen函数如何在内部工作?

C strlen函数如何在内部工作?,c,strlen,C,Strlen,strlen()如何在内部工作?函数中是否存在任何固有的错误?strlen通常通过计算字符串中的字符来工作,直到找到\0字符。一个规范的实现是: size_t strlen (char *str) { size_t len = 0; while (*str != '\0') { str++; len++; } return len; } 至于函数中可能存在的固有错误,则没有-它完全按照文档所述工作。这并不是说它没有某些问题,也就是

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

strlen
通常通过计算字符串中的字符来工作,直到找到
\0
字符。一个规范的实现是:

size_t strlen (char *str) {
    size_t len = 0;
    while (*str != '\0') {
        str++;
        len++;
    }
    return len;
}
至于函数中可能存在的固有错误,则没有-它完全按照文档所述工作。这并不是说它没有某些问题,也就是说:

  • 如果您传递的“字符串”结尾没有
    \0
    ,您可能会遇到问题,但从技术上讲,这不是C字符串(a),这是您自己的错
  • 您不能在字符串中放入
    \0
    字符,但在这种情况下,它不会是C字符串
  • 这不是最有效的方法-你可以提前储存长度,这样你可以更快地获得长度
但这些都不是bug,它们只是设计决策的结果

关于最后一点,请参见Joel Spolsky在其中讨论的各种字符串格式及其特征,包括普通C字符串(带终止符)、Pascal字符串(带长度)以及两个以null结尾的Pascal字符串的组合

尽管他对最后一种类型有一个更为丰富多彩的术语,但每当我想到Python优秀(而且完全不相关)的f字符串时,就会想到这个术语:-)


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

字符串是以第一个空字符结尾并包含该空字符的连续字符序列