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

news2025/1/11 21:54:03


  • 文章主题:库函数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语言知识的掌握,是一种很不错的训练方法,作为刚学编程的小白,可能在一些设计逻辑方面有些不足,欢迎评论区进行指正!看都看到这了,点个小小的赞或者关注一下吧(当然三连也可以~),你的支持就是博主更新最大的动力!让我们一起成长,共同进步!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1030435.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Postman 的使用教程(详细)

Postman 使用教程 1. 是什么 Postman 是一个接口测试工具软件&#xff0c;可以帮助开发人员管理测试接口。 官网&#xff1a;https://www.getpostman.com/ 2. 安装 建议通过官网下载安装&#xff0c;不要去那些乱七八糟的下载平台&#xff0c;或者留言获取 官网下载地址&am…

【unity】关于技能释放shader.CreateGPUProgram造成卡顿,优化和定位方法。

关于优化方法&#xff0c;UWA这边有介绍 Unity移动端游戏性能优化简谱之 CPU耗时调优|单帧|动画|调用|unity|实例化_网易订阅 对此&#xff0c;我们可以将Shader通过ShaderVariantCollection收集要用到的变体并进行AssetBundle打包。在将该ShaderVariantCollection资源加载进内…

30.CSS文本悬停过渡效果

效果 源码 index.html <!doctype html> <html> <head><meta charset="utf-8"><title>CSS Focus Text Hover Effects</title><link rel="stylesheet" href="style.css"> </head> <body>…

自动化发布npm包小记

1.注册npm账号 打开npm官网&#xff0c;并注册自己的npm账号 2.申请AccessToken 1.登录npm官网&#xff0c;登录成功后&#xff0c;点开右上角头像&#xff0c;并点击Access Tokens选项 2.点开Generate New Token下拉框&#xff0c;点击Classic Token(和Granular Access To…

ChatGPT WPS AI 一键制作各类汇报型PPT演示文档

在WPS AI中生成一个PPT文档。 操作步骤如下 :

Vue中使用VueAMap

npm 安装 npm install vue-amap --save注册:高德地图 // 在main.js中注册:高德地图 import VueAMap from "vue-amap"; Vue.use(VueAMap); VueAMap.initAMapApiLoader({key: "你的高德key",plugin: ["AMap.AutoComplete", //输入提示插件"A…

Android12之Codec2.0配置编解码器为H264实现(四十五)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药. 更多原创,欢迎关注:Android…

NSS [NISACTF 2022]middlerce

NSS [NISACTF 2022]middlerce 开题&#xff0c;直接给了源码。 由语句$command json_decode($txw4ever,true)[cmd];可得&#xff0c;$txw4ever一定是json格式的数据&#xff0c;但是&#xff0c;preg_match()函数却过滤了{&#xff0c;同时.*贪婪匹配后又匹配括号里的字符&am…

讯飞星火认知大模型Java后端接口

文章目录 1.免费申请星火大模型套餐2.Java后端接口说明2.1 项目地址2.2 项目说明2.3 项目结构2.4 项目代码&#x1f340; maven 依赖&#x1f340; application.yml 配置文件&#x1f340; config 包&#x1f4cc; XfXhConfig &#x1f340; dto 包&#x1f4cc; MsgDTO&#x…

【漏洞复现】五、seacms 远程命令执行(CNVD-2020-22721)

五、seacms 远程命令执行 &#xff08;CNVD-2020-22721&#xff09; 5.1、漏洞原理 在w1aqhp/admin_ip.php下第五行使用set参数&#xff0c;对用户输入没有进行任何处理&#xff0c;直接写入文件。攻击者可利用该漏洞执行恶意代码&#xff0c;获取服务器权限 5.2、影响版本 …

flink集群与资源@k8s源码分析-回顾

本章是分析系列最后一章,作为回顾,以运行架构图串联起所有分析场景 1 启动集群,部署集群(提交k8s),新建作业管理器组件 2 构建和启动flink master组件 3 提交作业,N/A

百度APP iOS端包体积50M优化实践(六)无用方法清理

一、前言 百度APP包体积经过一期优化&#xff0c;如无用资源清理&#xff0c;无用类下线&#xff0c;Xcode编译相关优化&#xff0c;体积已经有了明显的减少。但是优化后APP包体积在iPhone11上仍有350M的空间占用。与此同时百度APP作为百度的旗舰APP&#xff0c;业务迭代非常多…

PlotNeuralNet resnet34和resnet18绘图

文章目录 resnet18resnet34 PlotNeuralNet网络 可以发现&#xff0c;resnet34和resnet18只有块的数量不一样&#xff0c;经过简单的修改即可得到 resnet18 \documentclass[border12pt, multi, tikz]{standalone} \usepackage[fontsize14pt]{fontsize} \usepackage{import} \su…

Spark 【分区与并行度】

RDD 并行度和分区 SparkConf setMaster("local[*]") 我们在创建 SparkContext 对象时通常会指定 SparkConf 参数&#xff0c;它包含了我们运行时的配置信息。如果我们的 setMaster 中的参数是 "local[*]" 时&#xff0c;通常代表使用的CPU核数为当前环境…

DevOps与CI/CD常见面试问题汇总

01 您能告诉我们DevOps和Agile(敏捷)之间的根本区别吗&#xff1f; 答&#xff1a;尽管DevOps与敏捷方法&#xff08;这是最流行的SDLC[Software Development Life Cycle]方法之一&#xff09;有一些相似之处&#xff0c;但两者在软件开发方面都是根本不同的方法。以下是两者之…

mysql 在eclipse在配置

一、在Windows&#xff08;窗口&#xff09;/Preferences&#xff08;首选项&#xff09;/Java/Build path&#xff08;构建路径&#xff09;/User Library&#xff08;用户库&#xff09;里面直接把建一个Mysql&#xff0c; 二、Add External JARs… 添加mysql-connector-java…

python学习之【with语句】

前言 上一篇文章 ​ ​python学习之【文件读写】​​​ 中我们学习了python当中的文件读写&#xff0c;这篇文章接着学习python中文件读写的with语句。 了解with语句 在很多场景中&#xff0c;通过使用with语句可以让我们可以更好地来管理资源和简化代码&#xff0c;它可以看…

洛谷刷题入门篇:顺序结构

链接如下&#xff1a;https://www.luogu.com.cn/training/100#problems 一、Hello,World! 题目链接&#xff1a;https://www.luogu.com.cn/problem/B2002 题目描述 编写一个能够输出 Hello,World! 的程序。 提示&#xff1a; 使用英文标点符号&#xff1b;Hello,World! 逗…

Windows下,快速部署开发环境,第三方库管理,以及项目迁移工具介绍

对于在windows下做c开发的同学&#xff0c;你是否有以下痛点&#xff1f;&#xff1a; 1.每次构建c项目,搭配第三方库环境,都要不停的include,lib,dll等配置,如果4-5个还好,要是10几个...人都麻了... 2.一个环境也无所谓,问题x64/32位系统,Debug,Release都要配置一遍..每次配置…

【C# Programming】值类型、良构类型

值类型 1、值类型 值类型的变量直接包含值。换言之&#xff0c; 变量引用的位置就是值内存中实际存储的位置。 2、引用类型 引用类型的变量存储的是对一个对象实例的引用&#xff08;通常为内存地址)。 复制引用类型的值时&#xff0c;复制的只是引用。这个引用非常小&#xf…