【发布时间】:2020-02-16 05:11:15
【问题描述】:
我知道strlen() 不计算 NUL 终止字符。我真的知道这是事实。因此,这个问题不是要问为什么strlen() 可能“可能”不会返回正确的字符串长度,这已经在 StackOverflow 上被问到并得到了很好的回答,f.e.在这个thread,或this one。
让我们继续我的问题:
在 ISO/IEC 9899:1990 (E) 中; 7.1.1.,声明:
字符串是由终止并包括第一个空字符的连续字符序列。
原因是什么,为什么strlen() 偏离了这个已形成的标准,并且不“想要”接受 其 NUL 终止字符的字符串?
为什么?
【问题讨论】:
-
终止 NUL 字节是元数据(和实现细节),其他字符是数据。您可以轻松创建
strlen_w_terminator函数。 -
因为更改它会破坏太多代码,以至于它可能会被标准采用。请记住,第一个
C标准出现并基本上编纂了该语言的现有工作实践, -
典型的用例是获取字符串中实际字符的长度,不包括终止符。它还遵循从零开始的索引语义,因此
some_string[strlen(some_string)]将始终是终止符。 -
将两个字符串连接在一起时,终止符不会保留为第一个字符串的一部分。因为它是元数据。它用于标记字符串的终止。它不是数据本身的一部分。
std::string不将'\0'视为元数据,它是字符串本身的一部分。 -
兼容其他语言。 IE。在 MS basic 中,字符串是由保存字符串长度的字段和保存字符串的数组组成的结构。使用
Len基本运算符,您期望检索字符串中的有效字符数或整个结构的大小?正如许多人已经说过的那样,终止\0空字符不是字符串的一部分,而是类型表示的功能部分。在C中添加不存在原生字符串类型,将其视为复合类型,该方法strlen返回有效的用户字符。