【发布时间】:2011-05-07 04:18:58
【问题描述】:
strlen() 在内部是如何工作的?该功能是否存在任何固有的错误?
【问题讨论】:
strlen() 在内部是如何工作的?该功能是否存在任何固有的错误?
【问题讨论】:
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 标准):
字符串是由第一个空字符终止并包括第一个空字符的连续字符序列。
【讨论】: