C 语言 strlen 函数,用于得到字符串长度,今天我们来聊聊这个函数,先看看这段代码吧
1 int main() 2 { 3 char s[] = "Hello String"; 4 printf("value of s =%s\n", s); 5 printf("sizeof s = %d\n", sizeof(s)); 6 printf("length of s = %d.\n", strlen(s)); 7 return 0; 8 }
输出的结果如下:
strlen 返回结果和 sizeof 不一致, sizeof 返回值比strlen 多1,strlen 判断 '\0' 作为字符串结束标志, '\0'不算在字符串长度内。sizeof 是计算内存中占用的长度,'\0' 是需要有一位来保存的,它算在 s 中,所以返回值会比strlen 多1.
在使用 strlen 这一类字符串函数时,需要引用对应的头文件,需要引用 <string.h>, 在命令行输入: whereis string.h, 可看到文件目录为 /usr/include/string.h。
(在windows 环境安装 VS 后,文件大致在这个C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include 位置)
Linux中打开头文件,查看到函数原型声明如下:
__BEGIN_NAMESPACE_STD /* Return the length of S. */ extern size_t strlen (const char *__s) __THROW __attribute_pure__ __nonnull ((1)); __END_NAMESPACE_STD
WINDOWS:
_Check_return_ size_t __cdecl strlen(_In_z_ const char * _Str);
先只关注到函数声明的本体
extern size_t strlen (const char *__s)
传入参数const char *, 返回值为 size_t, 如果让我们自己来实现这个函数,可能的代码如下
1 size_t mstrlen(const char *s) 2 { 3 assert(s!=NULL); 4 size_t n=0; 5 while(*s++ != '\0' && ++n) 6 ; 7 return n; 8 }
作为一个C、C++语言的编程习惯,传入参数为指针的时候,先判断是否为空.
定义 size_t 类型的变量,初始化为0,这一句也很重要。
如果我们不初始化为0,得到的结果未定义。
如果我们把第4行代码改为 size_t n;
结果如下
运行同一个程序三次,获取的结果不相等,结果是随机的。
while 条件中我应用了 C和C++的短路求值属性,如果第一个条件满足了,中间是 "&&" 连接,第二个表达式才会被执行,
如果中间是 "||", 只有第一个条件不满足时,第二个表达式才会被执行。(目前大部分语言都支持短路求值short evaluation, 就我所熟悉的几种语言来说,只有VB 不支持)
第6行只有一个C的行结束符号 ";", 它是针对while 循环的,因为我的 ++n 放在循环体表达式中,这里不需要做任何事情,但是我必须告诉编译器这里有 while 循环体中的逻辑. 如果我不加分号,结果如下
返回结果为1,因为while循环只会执行一次。
注: 我在写 mstrlen 时用的短路求值,在实际中,如果用它能提高效率,那么尽量用短路求值。不然我们需要尽可能的写出容易读懂,便于维护的代码。