当前位置: 首页 > news >正文

字符串统计:strlen函数的讲解,及其模拟实现

前言部分:

    在C语言中,对于字符和字符串的处理很少频繁!!但是在C语言中,是没有字符串类型的,字符串通常放在常量字符串或者字符数组里面,字符串常量适用于那些对它不做修改的字符串函数!!

  笔者之前就有过关于字符串函数的讲解部分!有意者,请参考笔者代码!!笔者在之前就写过100++的文章,一直在学习C语言的路上!坚持着书写代码!!有不懂得问题请及时私聊

 1.函数介绍:

  求字符串长度(strlen函数)

对于strlen 统计的是在字符串中 ‘\0'之前出现的字符个数(不包含'\0')

请参考代码:

#include <stdio.h>
#include <string.h>
int main()
{
	// a b c d e f \0 一共7个元素
	char arr[] = "abcdef";
	printf("%d\n", strlen(arr));
	return 0;
}

代码的运行结果为:

 上述代码中:char arr[] = "abcdef";  一共有     a b c d e f \0 一共7个元素    ,但是当\0的位置在:

a b c \0 d e f  的时候,代码的运行结果为:

 

对于:char arr[]={'a','b','c'};此时:代码的运行结果就是随机值了!! 代码的运行结果为:

 在上述的代码中,多次使用到了strlen函数!!下面笔者对strlen这个函数进行讲解:

size_t strlen (const char* str)

 const char* str  :指针—》地址—》首字符的地址!

对于strlen函数,本文主要有一下讲解!!

1.参数指向的字符串必须以'\0'结束

2.注意函数的返回值为:size_t类型(无符号的整型)易错部分,紧急必坑!!

3.学会strlen函数的模拟实现!!

证明:返回值为size_t (无符号整型)!

请看笔者代码:

#include <stdio.h>
#include <string.h>

int main()
{
	if (strlen("abc") - strlen("abcdef"))
	{
		printf(">\n");
	}
	else
	{
		printf("<\n");
	}
	return 0;
}

这个代码中:strlen("abc") - strlen("abcdef")  对于该字符串的大小,想必读者肉眼都能看清楚!3-6=-3!!!直接的想法便是:'<'  ;那么便是大错特错了!!怎可能会是按照这样的想法来呢??

请看打印的结果:

若有不相信的读者,可以自行尝试!!

原因在于:打印的结果为:size_t类型(无符号的整型)!!对于无符号数-无符号数=无符号数!想必读者没有多大的疑问吧!!

因此,可以总结的来说!字符串的长度不可能为负数!所以,strlen函数为无符号数!

下面笔者来对strlen函数进行模拟实现!!请各位老铁仔细欣赏!!走神将会错过好戏!

#include <stdio.h>
#include <string.h>
#include <assert.h>

size_t my_strlen(const char* str)
{
	assert(str);
	const char* start = str;//记录起始地址
	const char* end = str;  //记录结束地址
	while (*end != '\0')
	{
		end++;
	}
	return end - start;  //结束时候的位置减去起始位置等于中间的字符个数
}

int main()
{
	char arr[] = "abcdef";
	int len = my_strlen(arr);
	printf("%d\n", len);
	return 0;
}

在上述代码中:笔者对strlen统计字符串长度的函数来进行模拟实现了一下!!

1.对于在main函数里面:这里的int len = my_strlen(arr);  arr是指:起始地址,即'a'的地址!!

2.对于size_t my_strlen(const char* str) 是按照strlen 函数的类型来进行定义的!!偷偷告诉各位老铁一句:不能将size_t换为void  ,若是进行替换将会出现错误!!对于:const char* str 是用指针来进行接收,前面加了const  是指对arr不能进行修改,这样显得更加完美!const 修饰的是:* str !

3.对于    assert(str);  断言,保证str 不为空指针!!因为,在后面有部分代码是对:str进行*(解引用操作)所以要确保str不为空指针!

4. 在while循环里面,end为什么能进行++操作呢??原因在于:const修饰的是:*end, 并没有限制end  !!但是,对于const * char end 这样进行书写,将会限制end进行++操作!!

5.end - start  :两个指针相减,得到的是两个指针之间的元素个数!!即字符串的长度!

代码的运行结果为:

 对于字符串统计:strlen函数的讲解,及其模拟实现 部分就到此结束,各位老铁,若有不同的想法,请及时联系笔者!!将会竭尽全力帮助各位老铁度过难关!

相关文章:

  • Linux——什么是环境变量?
  • 关于软件定时器的一些讨论
  • 睿智的目标检测60——Pytorch搭建YoloV7目标检测平台
  • Vue教程-监听路由ve-router变化,命名视图,路由嵌套,路由参数,路由高亮,router-link,redirect,创建路由,
  • 知识点杂记
  • 微信小程序入门与实战之rpx响应式单位与flex布局
  • @RequestMapping用法详解
  • 【MATLAB教程案例20】关于优化类算法的改进方向探索及matlab仿真对比分析
  • [ vulhub漏洞复现篇 ] Apache Flink目录遍历(CVE-2020-17519)
  • mysql的聚簇索引和非聚簇索引
  • 【React项目】从0搭建项目,项目准备和基础构建
  • markdown数学公式编辑指令大全
  • ContentProvider 之 监听共享数据变化
  • 数字IC前端设计怎么学?薪资前景好吗?
  • IDEA+Java控制台实现房屋信息管理系统
  • ➹使用webpack配置多页面应用(MPA)
  • android 一些 utils
  • CSS3 聊天气泡框以及 inherit、currentColor 关键字
  • JavaScript实现分页效果
  • JS创建对象模式及其对象原型链探究(一):Object模式
  • ng6--错误信息小结(持续更新)
  • SpiderData 2019年2月13日 DApp数据排行榜
  • 半理解系列--Promise的进化史
  • 从0实现一个tiny react(三)生命周期
  • 搭建gitbook 和 访问权限认证
  • 关于Flux,Vuex,Redux的思考
  • 来,膜拜下android roadmap,强大的执行力
  • 跳前端坑前,先看看这个!!
  • 新书推荐|Windows黑客编程技术详解
  • ​​​​​​​​​​​​​​汽车网络信息安全分析方法论
  • ​【已解决】npm install​卡主不动的情况
  • #我与虚拟机的故事#连载20:周志明虚拟机第 3 版:到底值不值得买?
  • ()、[]、{}、(())、[[]]等各种括号的使用
  • (亲测有效)解决windows11无法使用1500000波特率的问题
  • (一)RocketMQ初步认识
  • .net core webapi 部署iis_一键部署VS插件:让.NET开发者更幸福
  • .net framwork4.6操作MySQL报错Character set ‘utf8mb3‘ is not supported 解决方法
  • .NET Standard、.NET Framework 、.NET Core三者的关系与区别?
  • .NET 反射的使用
  • .NetCore Flurl.Http 升级到4.0后 https 无法建立SSL连接
  • /proc/interrupts 和 /proc/stat 查看中断的情况
  • @property @synthesize @dynamic 及相关属性作用探究
  • @RequestMapping用法详解
  • @在php中起什么作用?
  • [BZOJ 1032][JSOI2007]祖码Zuma(区间Dp)
  • [bzoj1038][ZJOI2008]瞭望塔
  • [C/C++]数据结构 栈和队列()
  • [CSS]浮动
  • [datastore@cyberfear.com].Elbie、[thekeyishere@cock.li].Elbie勒索病毒数据怎么处理|数据解密恢复
  • [Gradle] 在 Eclipse 下利用 gradle 构建系统
  • [LeetCode]-Spiral Matrix III 螺旋矩阵
  • [linux] git lfs install 安装lfs
  • [NAND Flash 6.2] NAND 初始化常用命令:复位 (Reset) 和 Read ID 和 Read UID 操作和代码实现
  • [NET].NET Framework 3.5 SP1 真正的离线安装(转)
  • [nlp] grad norm先降后升再降