文章目录

  • strlen函数的讲解
  • strlen函数的模拟实现
    • 计数器方式
    • 递归的方式
    • 指针减指针的方式

strlen函数的讲解

strlen函数我们应该不陌生,它可以帮助我们求字符串的长度(不包括’\0’),但里面还有一些细节需要我们注意。看一下下面这张图:

strlen函数的头文件是<string.h>.如果要使用strlen这个函数,别忘记引头文件。
字符串是以 ‘\0’ 作为结束标志,strlen函数返回的是在字符串中 ‘\0’ 前面出现的字符个数。以下是用strlen函数时可能会遇到的几种问题,先看代码:

#include<stdio.h>
#include<string.h>
int main()
{char arr1[] = "qwer";char arr2[] = { 'q','w','e','r' };char arr3[] = { 'q','w','e','r','\0'};char arr4[10]= { 'q','w','e','r' };printf("arr1:%d\n", strlen(arr1));printf("arr2:%d\n", strlen(arr2));printf("arr2:%d\n", strlen(arr3));printf("arr2:%d\n", strlen(arr4));return 0;
}

以上代码输出的结果是什么?大家可以先试着算一下。然后再看运行结果。

运行结果如图所示,arr1初始化的时候存放的是字符串,字符串的是以’\0’ 为结束标志的,所以arr1的大小为4。这个应该问题不大。
重点说一下下面这几个。
arr2:我在初始化arr2的时候,是对arr2是以字符进行初始化的,但是我没有设置arr的大小,所以编译器是不知道arr2的大小的,后面存放的是什么东西也是不知道的,但是strlen它是找’\0’的,并返回’\0’之前字符的个数。所以
在strlen找到’\0’之前,前面有36个字符。
arr3:arr3与arr2不同的是,但是我在最后输入了’\0’进行初始化,所以arr3很简单的就找到了’\0’,并返回4。
arr4:arr4与arr2不同的是:我这次设置了arr4的大小,然后我用字符对arr4进行了初始化,虽然是用字符进行的部分初始化,但是编译器会帮我把没初始化的地方默认初始化为0,‘\0’的ASCII码值就是0,C语言字符在内存的形式就是ASCII码值,所以后面没初始化的地方存放的都是’\0’。

我们再来看一个东西,由上面的图,我们还可以知道strlen的返回值是size_t,这是一个无符号数。如果不清楚这个地方,我们也可能会在使用strlen的时候出现一些问题。看一下下面的代码:

#include<stdio.h>
#include<string.h>
int main()
{if (strlen("abc") - strlen("qwer") < 0){printf("1");}else{printf("0");}return 0;
}

对于上面的代码的运行结果是什么?
按常理来说,前面的字符串大小为3,后面的为4,比4小应该会打印1。我们来看运行结果:

它的运行结果是0,难道前面的字符串大小比后面的大吗,其实不是。关键在于它的返回值是一个无符号数。无符号数只有正数,没有负数。3-4=-1,但是此时的-1并不是有符号数,而是一个无符号数,那么-1此时就是一个很大的正数。所以此时才会输出0
如果要解决这个问题,有以下两种解决方案:
方法1:不相减,进行比较:

#include<stdio.h>
#include<string.h>
int main()
{if (strlen("abc") < strlen("qwer")){printf("1");}else{printf("0");}return 0;
}

方法2:强制类型转换

#include<stdio.h>
#include<string.h>
int main()
{if ((int)strlen("abc") -(int)strlen("qwer") < 0){printf("1");}else{printf("0");}return 0;
}

说一下方法1,无符号数只有正数,没有负数,直接计算大小(正数)就可以直接比较了。方法2是强制转换为int类型的数据,整型是有符号数,有符号数就可以进行相减,结果为-1,就是-1。两种结果输出结果都是1.

strlen函数的模拟实现

讲完了strlen函要注意的问题,下面讲一下strlen函数的模拟实现。总共有三种方法:计数器方式,递归的方式和指针-指针的方式

计数器方式

实现的思想:设置一个计数的变量,让一个字符指针遍历字符数组的每一个元素,如果指针指向的元素不是’\0’,计算器就自增,直到指针指向的元素是’\0’,就停止遍历,并返回计数器。
因为是模拟实现,我们就只求一致,返回值就设置为size_t
实现代码如下:

#include<stdio.h>
#include<string.h>
#include<assert.h>size_t my_strlen(const char* p)
{int count = 0;assert(p != NULL);//如果等于空指针就会报错while((*p) != '\0'){count++;p++;}return count;
}
int main()
{char arr[] = "CSDN";int ret = my_strlen(arr);printf("%d", ret);return 0;
}

递归的方式

代码实现的思想:这种方式是不用创建临时变量的一种方法, 只使用指针进行遍历,如果指针指向的不是’\0’,那么就返回1和指针指向后一个数据的结果。

size_t my_strlen(const char* p)
{if ((*p) == '\0'){return 0;}else{return 1 + my_strlen(p+1);}
}
int main()
{char arr[] = "CSDN";int ret = my_strlen(arr);printf("%d", ret);return 0;
}

指针减指针的方式

代码实现的思想:
元素名是首元素的地址,我们就在定义一个指针,指向这个数组,让这个指针进行遍历,指向的不是’\0’就让指针进行自增。最后让遍历完数组的指针减去数组名(也就是首元素的地址)。
注意:当两个指着指向同一块空间时,指针减指针的绝对值就是两个指针之间的元素个数,而不是 个数*数据类型所占的空间

size_t my_strlen(const char* p)
{char* s = p;while((*s) != '\0'){s++;}return s - p;
}
int main()
{char arr[] = "CSDN";int ret = my_strlen(arr);printf("%d", ret);return 0;
}

文章就写到这了,感谢你的观看!希望对你有帮助!(水平有限,如有错误,欢迎大佬指正!感谢!)

【C语言】strlen函数的讲解和模拟实现相关推荐

  1. C语言strlen函数详细讲解

    1.strlen函数的功能和字符串的基础知识 计算字符串的长度,返回的是字符串长度,准确来说,返回的是字符串中'\0'之前的字符个数(不包含'\0'),并且是无符号类型. 在C语言中,没有字符串这种变 ...

  2. C语言strlen库函数的讲解

    C语言strlen库函数的讲解 附1:MSDN关于库函数strlen的解释 思路: 1.从MSDN中关于strlen库函数的讲解中我们可以知道的是,strlen库函数的头文件是<string.h ...

  3. C语言 strlen 函数 - C语言零基础入门教程

    目录 一.strlen 函数简介 二.strlen 函数实战 三.猜你喜欢 零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C 语言基础入门 一.strlen 函数简介 ...

  4. C语言strlen()函数用法

    C语言strlen()函数:返回字符串的长度 头文件:#include <string.h> strlen()函数用来计算字符串的长度,其原型为:unsigned int strlen ( ...

  5. C语言 strstr函数的用法及模拟实现strstr函数

    C语言 strstr函数的用法及模拟实现strstr函数 一.strstr函数的用法 二.模拟实现strstr函数的功能 一.strstr函数的用法 1.strstr函数原型:char* strstr ...

  6. 切割字符串长度php,C++_C语言中计算字符串长度与分割字符串的方法,C语言strlen()函数:返回字符串 - phpStudy...

    C语言中计算字符串长度与分割字符串的方法 C语言strlen()函数:返回字符串的长度头文件: #include strlen()函数用来计算字符串的长度,其原型为: unsigned int str ...

  7. strlen函数的用法及模拟实现strlen函数的两种方法

    strlen函数的用法及模拟实现strlen函数的两种方法 一.strlen函数的用法 strlen的简单应用 二.指针模拟实现strlen函数 三.递归模拟实现strlen函数 一.strlen函数 ...

  8. c语言strlen函数的作用是什么,c语言strlen函数的使用方法是什么

    c语言strlen函数的使用方法是什么 发布时间:2020-08-20 11:54:33 来源:亿速云 阅读:116 作者:小新 小编给大家分享一下c语言strlen函数的使用方法是什么,希望大家阅读 ...

  9. C语言 strlen()函数

    C语言 strlen 函数用来求字符串的长度(包含多少个字符). strlen() 函数从字符串的开头位置依次向后计数,直到遇见\0,然后返回计时器的值.最终统计的字符串长度不包括\0. 头文件:st ...

最新文章

  1. ansible role中常代码块
  2. led显示屏背景墙设计_全彩LED显示屏比例设计因素都有哪些?
  3. 理解Vue 2.5的Diff算法
  4. 以整体思维看问题:解决单页应用,系统角色请求覆盖身份唯一标识(本项目中是session_id命名的)发送请求问题...
  5. python画皇冠_用Python画小女孩放风筝的示例
  6. c简单的链表错误及改正
  7. 鬼吹灯-漫谈大型网站的架构
  8. 支持tls的tcp服务器,TCP+TLS
  9. 【转载】pyinstaller的使用和几个坑
  10. php pod模式,k8s pod的4种网络模式最佳实战(externalIPs )
  11. #include <iostream> C++ Hello World!
  12. 【Window】英文系统显示中文乱码
  13. div中加入span右对齐后出现换行显示的两种解决办法(转)
  14. 研发团队管理实践总结
  15. 手机设备标识码(IMEI、MEID、UDID、UUID、ANDROID_ID、GAID、IDFA等)
  16. 如何在vs code中配置miniconda/anaconda环境(两种方法)
  17. win7 台式机建热点
  18. Broadcast 广播-(18)
  19. jQuery+Bootstrap美化弹出框
  20. 帮你百度一下源码 专治伸手党

热门文章

  1. 萌新安装mongodb
  2. 哈登18+9周琦1篮板 火箭擒灰熊季前赛四连胜
  3. ArcGIS中如何从中国行政边界矢量数据中获取部分省市区县乡的矢量数据
  4. 程序员免费学英语,省几万培训费!
  5. 抖音怎么引流卖童装?淘宝童装卖家利用抖音引流
  6. 推荐最新快手自动私信引流脚本教程,记得收藏
  7. 大学模电实验合集丨实验五 负反馈放大电路
  8. Freekan5.9-热播影视系统,完美修复众多BUG完整安装包--视频接口修复修复版
  9. Java基础:面向对象三大特征、五大原则
  10. 运算放大器偏置电阻的计算