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

【C语言】字符串函数上

👑个人主页:啊Q闻       

🎇收录专栏:《C语言》           

 🎉道阻且长,行则将至

前言 

这篇博客是字符串函数上篇,主要是关于长度不受限制的字符串函数(strlen,strcpy,strcat,strcmp)的使用和模拟实现。

 字符串函数的头文件都是string.h

一.strlen 

1.使用

 1.字符串是以'\0'结尾,strlen函数是返回字符串中位于'\0'前的出现的字符的个数

 2.参数指向的函数必须以'\0'结尾。

 3.strlen函数的返回值是size_t,是无符号的(因为字符的个数不可能为负数)。

 运行结果:

 在内存中存储为:

 关于第三点(strlen函数的返回值是size_t,是无符号的),我们可以写个代码验证一下

 

 在代码中:s1的长度为6,s2的长度为3,应该是s1>s2。但是结果却是s2>s1,这是因为3-6=-3,而返回的是无符号整型,就变成了一个很大的整数。

2.模拟实现 

方式一

int my_strlen(const char* s1)
{int count = 0;assert(s1);while (*s1)//'\0'的ASCII码值为0{count++;//统计字符个数s1++;//指针后移}return count;
}
int main()
{char* s1 = "asdfgh";int ret = my_strlen(s1);printf("%d", ret);return 0;
}

方式二 (递归方式)

int my_strlen(const char* s1)
{assert(s1);if (*s1 == '\0'){return 0;}else{return 1 + my_strlen(s1 + 1);//详解1}
}

 详解1:采用递归的方式,就不用创建临时变量,递归过程:

1+my_strlen("bcdef")

1+1+my_strlen("cdef")

1+1+1+my_strlen("def")

……

方式三(指针减指针的方式) 

int my_strlen(const char* s1)
{assert(s1);char*p=s1;//保留指针初始位置while (*p != '\0'){p++;}return p - s1;
}

二.strcpy 

1.使用 

 1.源字符串必须以’\0’结尾

2.会将源字符串的'\0'拷贝到目标空间

3.目标空间必须足够大并且可以修改

运行结果:  

 2.模拟实现

char* my_strcpy(char* dest, const char* src)
{char* ret = dest;//存留目的指针,便于后续返回assert(dest);assert(src);while (*src){*dest = *src;dest++;src++;}*dest = *src;//最后把'\0'赋给字符串return ret;
}
int main()
{char s1[20] = { 0 };char* s2 = "asdfgh";my_strcpy(s1, s2);printf("%s", s1);return 0;
}

 三.strcat

1.使用

1.源字符串必须以'\0'结尾

2.字符串也必须要有'\0',否则不知道从哪里开始追加。

3.目标空间足够大并且可以修改。 

 运行结果:

内存存储:

2.模拟实现 

char* my_strcat(char* dest, const char* src)
{char* ret = dest;assert(dest);assert(src);while (*dest)//遍历找到目标字符串的\0{dest++;}while (*src){*dest = *src;dest++;src++;}*dest = *src;return ret;
}

 四.strcmp

1.使用

1.比较字符串,是比较两个字符串对应位置上的ASCII码值

当第一个字符串长度大于第二个字符串,则返回大于0的数字。 

当第一个字符串长度小于第二个字符串,则返回小于0的数字。

当第一个字符串长度等于第二个字符串,则返回0。

运行结果:

详解:因为f的ASCII码值大于c的ASCII码值,所以s2>s1,返回值小于0 

2.模拟实现 

int my_strcmp(const char* p1, const char* p2)
{int ret = 0;assert(p1);assert(p2);while (*p1 == *p2){if (*p1 == "\0")//遍历完后所有都相等{return 0;}p1++;p2++;}return *p1 - *p2;
}

 谢谢你的阅读,如果对你有帮助的,三连么么么

相关文章:

【C语言】字符串函数上

👑个人主页:啊Q闻 🎇收录专栏:《C语言》 🎉道阻且长,行则将至 前言 这篇博客是字符串函数上篇,主要是关于长度不受限制的字符串函数(strlen,strcpy,strcat,strcm…...

Java集合基础知识总结(绝对经典)

List接口继承了Collection接口,定义一个允许重复项的有序集合。该接口不但能够对列表的一部分进行处理,还添加了面向位置的操作。 实际上有两种list:一种是基本的ArrayList,其优点在于随机访问元素,另一种是更强大的L…...

Linux:导出环境变量命令export

相关阅读 Linuxhttps://blog.csdn.net/weixin_45791458/category_12234591.html?spm1001.2014.3001.5482 Linux中的内建命令export命令用于创建一个环境变量,或将一个普通变量导出为环境变量,并且在这个过程中,可以给该环境变量赋值。 下面…...

案例--某站视频爬取

众所周知,某站的视频是: 由视频和音频分开的。 所以我们进行获取,需要分别获得它的音频和视频数据,然后进行音视频合并。 这么多年了,某站还是老样子,只要加个防盗链就能绕过。(防止403&#xf…...

清华把大模型用于城市规划,回龙观和大红门地区成研究对象

引言:参与式城市规划的新篇章 随着城市化的不断推进,传统的城市规划方法面临着越来越多的挑战。这些方法往往需要大量的时间和人力,且严重依赖于经验丰富的城市规划师。为了应对这些挑战,参与式城市规划应运而生,它强…...

Vue+SpringBoot打造创意工坊双创管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 管理员端2.2 Web 端2.3 移动端 三、系统展示四、核心代码4.1 查询项目4.2 移动端新增团队4.3 查询讲座4.4 讲座收藏4.5 小程序登录 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的创意工坊双创管理…...

Web框架开发-Django简介

一、MVC和MTV模型 MVC 所谓MVC就是把web应用分为模型(M),控制器(C)和视图(V)三层,他们之间以一种插件式的,松耦合的方式连接在一起,模型负责业务对象与数据库…...

VB播放器(动态服务器获取歌词)-183-(代码+说明)

转载地址: http://www.3q2008.com/soft/search.asp?keyword183 VBASP vb动态从服务器读取歌词 VB asp交互 程序, 模式不一样, 与普通的MP3播放器不一样, 这个是可以实现歌词从服务器上查询功能的. 看好了在咨询 我可以給您演示 目  录 前  言 1 1 . 简述 2 1.1 开发…...

java-可变参数

可变参数是什么? 可变参数就是指传入的参数个数是可变的,不是固定的 为什么要可变参数? 当我们要传入大量的形参时,我们就可以用到可变参数了 定义格式 数据类型...变量名; 例如int ...a; 可变参数的细节: &…...

嵌入式学习day37 数据结构

1.sqlite3_open int sqlite3_open( const char *filename, /* Database filename (UTF-8) */ sqlite3 **ppDb /* OUT: SQLite db handle */ ); 功能: 打开数据库文件(创建一个数据库连接) 参数: filename:数据库文…...

嵌入式学习39-程序创建数据库及查找

1.sqlite3_open int sqlite3_open( const char *filename, /* Database filename (UTF-8) */ sqlite3 **ppDb /* OUT: SQLite db handle */ ); 功能: 打开 数据库文件(创建一个数据库连接) 参数: filename: …...

科研三维模型高精度三维扫描服务3d逆向测绘建模工业产品抄数设计

三维抄数技术在科研三维模型的应用已经日益广泛,其高精度、高效率的特点使得科研工作者能够更快速、更准确地获取和分析数据。这一技术的核心在于通过专业的三维扫描仪对实物进行高精度测量,再将这些数据转化为三维数字模型,为后续的研究提供…...

【LeetCode热题100】141. 环形链表(链表)

一.题目要求 给你一个链表的头节点 head ,判断链表中是否有环。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置…...

express+mysql+vue,从零搭建一个商城管理系统11--使用Sequelize

提示:学习express,搭建管理系统 文章目录 前言一、安装sequelize和mysql2二、修改config/db.js三、修改models/user.js,models/shop.js,models/goods.js四、新建dao/user.js,dao/shop.js,dao/goods.js五、修…...

霹雳学习笔记——6.1 ResNet网络结构、BN以及迁移学习

一、ResNet结构 ResNet是一个突破一千层的网络架构。主要是卷积层Conv和池化层的堆叠。但是普通的堆叠会使得错误率更高,如下图所述,这是因为会产生梯度消失/梯度爆炸等。(梯度就是增量,有大小有方向) 解决方法&#…...

Gitee的注册和代码提交(附有下载链接)

目录 一、Git的下载和安装二、安装图形化界面工具三、在Gitee上创建仓库四、如何把仓库开源五、Clone远程仓库到本地六、拷贝代码到本地的仓库七、Add-Commit-Push到远程仓库八、可能出现的问题8.1 建议在本地仓库直接创建项目8.2 第一次Push可能出现的问题8.3 怎么删除Gitee上…...

机器学习是什么?

机器学习是一种人工智能(AI)的分支,其主要目标是使计算机系统能够通过数据和经验来改进和学习,而无需明确地编程。在机器学习中,计算机系统会通过对大量数据进行学习和分析,从中发现模式和规律,…...

复盘-PPT

调整PPT编号起始页码在设计→幻灯片大小 设置所有以及文本项目符号 ## 打开母版,找到对应级别设置重置 当自动生成的smartart图形不符合预期时 1 2...

springcloud gateway网关动态配置限流

上一篇记录了gateway网关的基础功能和配置,并且使用了默认的限流功能。 springcloud gateway网关-CSDN博客 这里简单记录一下gateway网关集成mybatisPlus实现动态限流。gateway网关默认的限流方式各项限流参数都是在配置文件中配置,不够灵活&#xff0…...

在Linux/Ubuntu/Debian中使用windows应用程序/软件

Wine 是一个兼容层,允许你在类 Unix 操作系统(包括 Ubuntu)上运行 Windows 应用程序。 以下是在 Ubuntu 上安装和使用 Wine 的基本步骤: 在 Ubuntu 上安装 Wine: 更新软件包列表: 打开终端并运行以下命令以…...

大数据学习栈记——Neo4j的安装与使用

本文介绍图数据库Neofj的安装与使用,操作系统:Ubuntu24.04,Neofj版本:2025.04.0。 Apt安装 Neofj可以进行官网安装:Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》

引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)

1.获取 authorizationCode: 2.利用 authorizationCode 获取 accessToken:文档中心 3.获取手机:文档中心 4.获取昵称头像:文档中心 首先创建 request 若要获取手机号,scope必填 phone,permissions 必填 …...

云原生玩法三问:构建自定义开发环境

云原生玩法三问:构建自定义开发环境 引言 临时运维一个古董项目,无文档,无环境,无交接人,俗称三无。 运行设备的环境老,本地环境版本高,ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...

AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机

这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机,因为在使用过程中发现 Airsim 对外部监控相机的描述模糊,而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置,最后在源码示例中找到了,所以感…...

在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)

考察一般的三次多项式,以r为参数: p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]; 此多项式的根为: 尽管看起来这个多项式是特殊的,其实一般的三次多项式都是可以通过线性变换化为这个形式…...

脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)

一、OpenBCI_GUI 项目概述 (一)项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台,其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言,首次接触 OpenBCI 设备时,往…...

Linux-进程间的通信

1、IPC: Inter Process Communication(进程间通信): 由于每个进程在操作系统中有独立的地址空间,它们不能像线程那样直接访问彼此的内存,所以必须通过某种方式进行通信。 常见的 IPC 方式包括&#…...

java 局域网 rtsp 取流 WebSocket 推送到前端显示 低延迟

众所周知 摄像头取流推流显示前端延迟大 传统方法是服务器取摄像头的rtsp流 然后客户端连服务器 中转多了,延迟一定不小。 假设相机没有专网 公网 1相机自带推流 直接推送到云服务器 然后客户端拉去 2相机只有rtsp ,边缘服务器拉流推送到云服务器 …...

基于django+vue的健身房管理系统-vue

开发语言:Python框架:djangoPython版本:python3.8数据库:mysql 5.7数据库工具:Navicat12开发软件:PyCharm 系统展示 会员信息管理 员工信息管理 会员卡类型管理 健身项目管理 会员卡管理 摘要 健身房管理…...