strlen 函数

2019-08-16 07:44:19来源:博客园 阅读 ()

新老客户大回馈,云服务器低至5折

strlen 函数

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 时用的短路求值,在实际中,如果用它能提高效率,那么尽量用短路求值。不然我们需要尽可能的写出容易读懂,便于维护的代码。

 

 

 

  


原文链接:https://www.cnblogs.com/kylinhu/p/11131872.html
如有疑问请与原作者联系

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:P2670 【扫雷游戏】

下一篇:对C++类的继承和派生的理解