C语言每日一题(1):实现库函数strlen()

2023-09-14 17:56:47


  • 文章主题:库函数strlen()的实现
  • 所属专栏:C语言每日一题
  • 作者简介:每天不定时更新C语言的小白一枚,记录分享自己每日的所思所想。
  • 个人主页:[₽]的个人主页 

目录

前言

函数介绍

编程起因

设计思路

1.整体逻辑

2.参数类型

3.防止空指针

4.返回值

代码展示

结语


前言

函数介绍

strlen()函数是我们在C语言编程中常用到库函数。在C语言中它的头文件是<string.h>,它的功能是作为一个计数器,从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符'\0'为止,然后返回计数器值(长度不包含'\0')。

编程起因

在VS编译器的定义中我们得知,strlen()函数在该编译器中的返回值为size_t(和类型unsigned int等价,专门用来作为strle()等函数的返回值以及sizeof()操作符的结果类型),参数则为const char*,在知道了这个函数在VS编译器下的定义的情况下,我们是否也能通过函数的功能自己设计出一个strlen()函数呢?


设计思路

1.整体逻辑

根据strlen()函数的定义,函数参数为指针,也就是是数组首元素的地址。我们可以设计一个通过指针解引用后自增进而又解引用的循环结构来实现对数组元素内容的遍历(检测是否为'\0',若碰到'\0',则代表字符数组中储存的第一个'\0'前的字符串中非'\0'的字符已读完,字符串中非零字符的个数已计完),这样的设计从参数本质类型出发,可以简化设计结构(如果是数组下标访问符[]会复杂一些)。

2.参数类型

接着参数类型里的const的原理是保护*p,即原字符串中的内容,针对的是设计逻辑的调整,防止设计漏洞导致计算字符个数时直接改变了字符串内容还不报错,因此设计时也需要加入const。

3.防止空指针

又因为传递参数为指针,也需要设计防止传NULL的情况,使用断言这个宏可以一边避免NULL的传入,一边又指出程序出错的原因以及报错的位置,传野指针的情况无法避免,一般这种情况也较少,程序会报错或者无法输出。

4.返回值

最后,因为不管怎么传哪怕是空指针或者是野指针的情况下函数的返回值都不可能是负数,我们就可以用专门表示这种类型的unsigned int或者是size_t来表示,因为编译器中定义无符号整形时习惯用size_t,所以我们表示的时候也用size_t即可。


代码展示

#include <stdio.h>
#include <assert.h>//储存宏assert的头文件
size_t strlen_P(const char*);//函数strlen_P()的声明(对该函数使用进行声明)
int main()
{
	char str[100] = { 0 };
	printf("Please enter one sentence:\n");
	scanf("%s", str);
	printf("The number of words in this sentence is:\n");
	printf("%zd", strlen_P(str));
	return 0;
}
size_t strlen_P(const char* string)//函数strlen()的定义(对其具体运行逻辑进行定义)
{
	assert(string);//防止输入空指针
	size_t count = 0;
	while (*string++)//碰到'\0'时循环自动跳出,'\0'不参与计数
	{
		count++;//计字符串中非零字符数
	}
	return count;
}

效果呈现


结语

自己模仿设计常用库函数既可以加深我们对于该函数运行底层逻辑的理解,又可以锻炼我们的编程思维,提高我们对于各种C语言知识的掌握,是一种很不错的训练方法,作为刚学编程的小白,可能在一些设计逻辑方面有些不足,欢迎评论区进行指正!看都看到这了,点个小小的赞或者关注一下吧(当然三连也可以~),你的支持就是博主更新最大的动力!让我们一起成长,共同进步!

更多推荐

自动化发布npm包小记

1.注册npm账号打开npm官网,并注册自己的npm账号2.申请AccessToken1.登录npm官网,登录成功后,点开右上角头像,并点击AccessTokens选项2.点开GenerateNewToken下拉框,点击ClassicToken(和GranularAccessToken有什么区别,请自行查验?)3.填写

WPF行为

行为是一款重用用户界面代码的更有挑战性的工具。其基本思想是:使用行为封装一些通用UI功能。如果具有适当的行为,可使用一两行XAML标记将其附加到任意元素,从而节省编写和调试代码的工作。样式提供了重用一组属性设置的实用方法。它们帮助构建一致的、组织良好的界面迈出了重要的第一步——但它们还有许多限制。问题是在典型的应用程序

多级缓存基础架构组件设计

基础架构组件-缓存背景目的缓存架构服务层多级缓存核心流程设计1、缓存介质2、如何实现spring注解方式多级缓存如何实现缓存的永久存储又可以过期刷新,而避免缓存失效带来的一系列缓存雪崩、击穿等问题实现缓存包装类多级缓存处理器实现1、lookup(Objectkey)2、get(Objectkey)3、重头戏get(Ob

Lua 多返回值

Lua这门神奇的语言可以在函数里面返回多个值具体函数如下functionmulti_return()return2,"hellowworld"endlocala,b=multi_return();--多个都返回print(a,b)localm=multi_return();--默认返回第一个返回值print(m)unp

搭建Flink集群、集群HA高可用以及配置历史服务器

Flink集群搭建Flink集群搭建集群规划下载并解压安装包修改集群配置分发安装目录启动集群访问WebUIFlink集群HA高可用概述集群规划配置flink配置master、workers配置ZK分发安装目录启动HA集群测试Flink参数配置配置历史服务器概述配置启动、停止历史服务器提交一个Job任务查看历史Job信息

数据结构上机练习——单链表的基本操作、头文件、类定义、main函数、多种链表算法的实现,含注释

文章目录单链表的基本操作实现1.头文件2.类定义和多种算法的实现2.1创建空表2.2头插法创建n个元素的线性链表2.3一个带头节点的链表存放一组整数,设计一个算法删除值等于x的所有节点。2.4计算线性表中值为偶数的节点个数2.5一个带头节点的单链表heada存放一组整数,设计分裂heada算法,偶数放在heada中,奇

二叉树的概念、存储及遍历

一、二叉树的概念1、二叉树的定义二叉树(binarytree)是n个结点的有限集合,该集合或为空集(空二叉树),或由一个根结点与两棵互不相交的,称为根结点的左子树、右子树的二叉树构成。二叉树的特点是:(1)每个结点最多有两棵子树,故二叉树中不存在度大于2的结点。(2)二叉树是有序的,其次序不能任意颠倒,即使树中的某个结

利用Socks5代理IP加强跨界电商爬虫的网络安全

随着跨界电商的兴起,爬虫技术在这个领域变得越来越重要。然而,网络安全一直是一个值得关注的问题。在本文中,我们将讨论如何利用代理IP和Socks5代理来增强跨界电商爬虫的网络安全,确保稳定和可靠的数据采集,同时避免封禁和风险。背景跨界电商是一个竞争激烈的领域,市场上的商品信息和价格常常会变动。为了保持竞争力,电商企业需要

CFGPT: Chinese Financial Assistant with Large Language Model

本文是LLM系列文章,针对《CFGPT:ChineseFinancialAssistantwithLargeLanguageModel》的翻译。CFGPT:大型语言模型的中文财务助理摘要1引言2相关工作3数据集4模型和训练5应用6结论摘要大型语言模型(LLM)在金融领域的自然语言处理任务中显示出巨大的潜力。在这项工作中

医疗虚拟仿真和虚拟现实有什么区别?哪个更好?

随着我们在仿真教育中越来越多地使用新技术,区分虚拟模式的类型很重要。虚拟仿真是一个统称,用来概括术语来描述各种基于仿真的体验,从基于屏幕的平台到沉浸式虚拟现实。然而,各虚拟平台在保真度、沉浸感和临场感的水平上有很大差异。医疗教育中存在许多虚拟解决方案的空间,对于护理虚拟仿真课程来说,没有"一刀切"的模式。在此就给大家介

如何完美通过token获取用户信息(springboot)

1.什么是Token?身份验证令牌(AuthenticationToken):在身份验证过程中,“token”可以表示一个包含用户身份信息的令牌。例如Token(JWT)是一种常见的身份验证令牌,它包含用户的身份信息(例如用户名或用户ID)以及其他相关信息,如权限或过期时间。无意义令牌token,这种一般在获取后通过n

热文推荐