C语言字符串操作函数详解①strlen函数的讲解与三种模拟实现方法(建议三连收藏)

目录

​编辑

前言

1.strlen函数介绍

2.模拟实现strlen

2.1计数器做法

2.2不创建临时变量,通过递归的方法 

2.3利用两个指针相减

 3.结语


前言

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

1.strlen函数介绍

函数文件:

<string.h>

 函数功能:从参数的地址开始,返回直到\0之前的字符个数。

返回值:类型:size-t 无符号整型

参数:const char *str  字符指针类型,通常得到字符串首元素的地址


①字符串已经 '\0' 作为结束标志,strlen函数返回的是在字符串中 '\0' 前面出现的字符个数(不包含 '\0' )。
②参数指向的字符串必须要以 '\0'结束。
③注意函数的返回值为size_t,是无符号的( 易错 )
 

对③进行解释:

看题目:

int main()
{if (strlen("abc") - strlen("absdef") > 0){printf("大于\n");}else{printf("小于等于\n");}return 0;

问:输出什么,正常按照整型返回值计算,返回一个是小于等于我们来看结果:

分析错误原因就是因为返回值是一个无符号的整型:

两者相减为-3

-3在内存中存储的原码为:10000000 00000000 00000000 00000011

                            反码:     11111111 11111111 11111111 11111100

                             补码:     11111111 11111111 11111111 11111101

当把这个 补码看做是一个无符号整型来进行打印,就会是一个非常大1的正数,所以打印大于。如果要正常我们可以这样修改代码

 ①利用强制类型转换

int main()
{if ((int)strlen("abc") - (int)strlen("absdef")>0){printf("大于\n");}else{printf("小于等于\n");}return 0;

②直接进行比较 

int main()
{if (strlen("abc") >strlen("absdef")){printf("大于\n");}else{printf("小于等于\n");}return 0;

2.模拟实现strlen

2.1计数器做法

实现思想:定义一个计数用的变量,通过指针,指针指向的是字符串首元素的地址,那么我们只用解引用判断内容是不是与‘\0’相等就好,不相等我们的计数器就+1,指针向后移动,直到找到\0.

对于参数部分的考虑:这里传递过来字符串首元素的地址,那我们用一个字符指针来接收,我们只是求这个字符串的大小,不希望去改变他,用const限制 

对于返回类型的考虑:①可以参照库函数将返回类型设置为无符号整型,因为字符串的长度始终是大于0的。

也可以设置为整型,这样就可以很好的解决上面的问题。 

这就是我们的实现代码: 

size_t my_strlen(const char* str){int count = 0;while (*str != '\0'){count++;str++;//地址后移}return count;
}int main()
{size_t len = my_strlen("abc");printf("%d\n", len);return 0;
}

我们看一下效果:

 

2.2不创建临时变量,通过递归的方法 

函数实现思想:

int my_strlen(const char * str)
{if(*str == '\0')return 0;elsereturn 1+my_strlen(str+1);
}

这里大家可以参照图解来理解代码,

2.3利用两个指针相减

实现思想:两个指向同一块空间的指针相减得到的绝对值是两个指针之间元素的个数。那么我们使用一个指针变量保存最开始字符串首元素的地址,然后让其往后移动直到找到\0,再利用两个指针作差,看一下实现:

int my_strlen(char *s)
{char *p = s;while(*p != ‘\0’ )p++;return p-s;
}

 3.结语

以上就是本期的所有内容,知识含量蛮多,大家可以配合解释和原码运行理解。创作不易,大家如果觉得还可以的话,欢迎大家三连,有问题的地方欢迎大家指正,一起交流学习,一起成长,我是nicn,正在c++方向前行的新手,感谢大家的关注与喜欢。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux文本三剑客-grep

1.grep简介&#xff1a; grep (global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具&#xff0c;它能使用正则表达式搜索文本&#xff0c;并把匹配的行打印出来&#xff0c;都是按行处理的。 grep 最主要…

Linux内核源码

记得看目录哦&#xff01; 1. 为什么要阅读Linux内核2. Linux0.01内核源码3. 阅读linux内核源码技巧4. linux升级内核5. linux的备份和恢复5.1 安装dump和restore5.2 使用dump完成备份5.3 使用restore完成恢复 1. 为什么要阅读Linux内核 2. Linux0.01内核源码 3. 阅读linux内核…

基于Java SSM框架实现影院购票系统项目【项目源码+论文说明】计算机毕业设计

基于java的SSM框架实现影院购票系统演示 摘要 21世纪的今天&#xff0c;随着社会的不断发展与进步&#xff0c;人们对于信息科学化的认识&#xff0c;已由低层次向高层次发展&#xff0c;由原来的感性认识向理性认识提高&#xff0c;管理工作的重要性已逐渐被人们所认识&#…

人工智能与机器学习——开启智能时代的里程碑

写在前面 前言人工智能与机器学习的概述监督学习、无监督学习和强化学习的基本原理监督学习&#xff1a;无监督学习&#xff1a;强化学习&#xff1a; 机器学习的算法和方法常见的机器学习算法和方法线性回归&#xff1a;决策树&#xff1a;支持向量机&#xff1a;神经网络&…

React、React Router、JSX 简单入门快速上手

React、React Router、JSX 简单入门快速上手 介绍特点 JSX使用js表达式渲染列表样式控制注意事项 入门脚手架创建react项目安装目录介绍入口文件解析 组件解析介绍函数式组件类组件 事件绑定注意点定义使用事件对象事件处理函数接收额外参数 组件状态状态的定义使用 组件通信父…

dp优化----单调队列解决定长连续区间最小值。 例题:Cashback--- 题解

E. Cashback 题目大意&#xff1a; 思路解析&#xff1a; 如果c1&#xff0c;那么无论如何 答案都为0. 如果c!1&#xff0c;我们考虑如果最优答案有一段区间长度小于c&#xff0c;那么它对答案的贡献值&#xff0c;等于将这个区间划分为长度为1的多个小段&#xff0c; 如果有…

【Midjourney】关于标准模型的几个按钮都有什么用

当用户在Midjourney Bot所在的服务发送/settings命令时就能调出设置窗口&#xff0c;本文将介绍该窗口中的各个按钮都有什么作用。 1.RAW Mode 依照官方的描述来看V5.2模型似乎带有自动优化功能&#xff0c;会对用户输入的关键词空白描述进行补全和优化&#xff0c;以便修复所…

与音乐共同奔跑:南卡/韶音/墨觉三款骨传导耳机的真实试用体验

作为一个热爱运动的音乐迷&#xff0c;跑步与听歌对我来说是一场每天必须的灵魂邂逅。没有音乐&#xff0c;我跑步的脚步就仿佛失去了节奏&#xff0c;每一步都沉重异常&#xff1b;有了音乐&#xff0c;每一次呼吸都充满了动力&#xff0c;仿佛我能一跃而过山丘&#xff0c;跃…

【日常总结】如何快速迁移Navicat中的全部连接设置到新安装的Navicat中?

一、场景 二、需求 三、解决方案 Stage 1&#xff1a;“文件”-->“导出连接”。 Stage 2&#xff1a;获取备份文件 connections.ncx Stage 3&#xff1a;导入connections.ncx 四、不足 一、场景 公司电脑换新&#xff0c;所有软件需要重装&#xff0c;包括navicat 1…

机器学习 | 掌握线性回归的实战技巧

目录 初识线性回归 损失和优化 欠拟合与过拟合 正则化线性模型 模型的保存与加载 初识线性回归 线性回归(Linearregression)是利用回归方程(函数)对一个或多个自变量(特征值)和因变量(目标值)之间关系进行建模的一种分析方式。特点是&#xff1a;有一个自变量的情况称为单…

Python算法题集_滑动窗口最大值

本文为Python算法题集之一的代码示例 题目239&#xff1a;滑动窗口最大值 说明&#xff1a;给你一个整数数组 nums&#xff0c;有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回 滑动窗…

Redis -- 背景知识

目录 特性 为啥Redis快? 应用场景 Redis不能做什么&#xff1f; Redis是在内存中存储数据的一个中间件&#xff0c;用作为数据库&#xff0c;也可以用作为缓存&#xff0c;在分布式中有很高的威望。 特性 In-memory data structures&#xff1a;在内存中存储数据key-val…