【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;
}

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

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

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

相关文章

“我快无聊死了”用英语怎么说?柯桥英语口语学习,成人零基础学外语

每日一句 Im bored to death. 我快无聊死了。 单词解析: bored / bɔːd / adj.无聊的,厌倦的 bored to d15857575376eath:指非常无聊或厌烦,达到了极点的程度。 "bored" 和 "boring" 都与无聊相关&#…

漏洞发现-漏扫项目篇武装BURP浏览器插件信息收集分析辅助

知识点 1、插件类-武装BurpSuite-漏洞检测&分析辅助 2、插件类-武装谷歌浏览器-信息收集&情报辅助 章节点: 漏洞发现-Web&框架组件&中间件&APP&小程序&系统 扫描项目-综合漏扫&特征漏扫&被动漏扫&联动漏扫 Poc开发-Ymal语…

产品测试方案:视频接入平台并发性能测试方案和报告(即150路视频并发流媒体服务器模块的性能测试方案和报告)

目 录 一、测试目的: 二、测试方案: 2.1、测试思路 2.2、拓扑图 三、测试环境 3.1 服务器配置 3.2 网络摄像机列表 3.3 测试软件 四、测试流程 4.1 H.264并发测试: 4.1.1老版本srsout3.10并发测试 4.1.2 新版本srsout…

【PyTorch][chapter 22][李宏毅深度学习]【无监督学习][ WGAN]【理论二】

前言: 本篇主要参考《Wasserstein GAN and the Kantorovich-Rubinstein Duality》 重点介绍一下 WGAN 的损失函数 是如何通过 Wasserstein Distance 变换过来的。 分为5步: 我们首先建立Wasserstein Distance 极小值形式, 经过对…

王道机试C++第6章 数学问题和22年蓝桥杯省赛选择题Day34

6.1 进制转换 二进制数(十转二) 习题描述 大家都知道,数据在计算机里中存储是以二进制的形式存储的。 有一天,小明学了C语言之后,他想知道一个类型为unsigned int 类型的数字,存储在计算机中的二进制串是…

详解Python中open()函数指定文件打开方式的用法

当我们用open()函数去打开文件的时候,有好几种打开的模式。 r->只读 w->只写,文件已存在则清空,不存在则创建。 a->追加,写到文件末尾 b->二进制模式,比如打开图像、音频、word文件。 ->更新(可读可写) 这个带号…

Spring MVC中的REST风格

文章目录 REST风格1 REST简介问题导入1.1 REST介绍1.2 RESTful介绍1.3 注意事项 2 RESTful入门案例问题导入2.1 快速入门2.2 PathVariable介绍2.3 RequestBody、RequestParam、PathVariable区别和应用 3 REST快速开发【重点】3.1 代码中的问题3.2 Rest快速开发 4案例&#xff1…

【node】模块化与包(二)

1、模块化的基本概念 模块化是指解决一个复杂的问题时,自顶向下逐层把系统划分成若干模块的过程。对于整个系统来说,模块是可组合、分解和更换的单元。 (1)模块化的优点 遵循固定规则,把大文件拆分成对立并相互依赖…

springboot3 打包报错32-bit architecture x86 unsupported或者 returned non-zero result

springboot3 打包异常情况处理记录 在测试springboot3 native打包时候遇到的异常,百度和谷歌上方法都无法解决我的问题,最后记录一下我最后的原因和解决方案。 前置要求:自己处理好vs的相关内容后 报错一: [1/7] Initializing…

蓝桥杯算法训练VIP-数组查找及替换

题目 1634: 蓝桥杯算法训练VIP-数组查找及替换 时间限制: 3s 内存限制: 192MB 提交: 1629 解决: 890 题目描述 给定某整数数组和某一整数b。要求删除数组中可以被b整除的所有元素,同时将该数组各元素按从小到大排序。如果数组元素数值在A到Z的ASCII之间&#xff0…

跨境电子商务支付与结算的支撑系统

​1、跨境电子商务支付与结算的核心系统。 核心系统是用户执行跨境电子商务支付的核心模块,包括以下具体流程。 ​ ​①用户从跨境电子商务支付应用启动跨境电子商务支付流程。 ②跨境电子商务支付应用根据应用和用户选择的支付工具,来调用对应的支付产…

Linux 动态库和静态库 【详解】

动静态库的基本原理 静态库(.a):程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候将不再需要静态库动态库(.so):程序在运行的时候才去链接动态库的代码,多个程序共享使用库的…

SkyEye:助力飞行器状态控制系统仿真

飞行器与常见的航天器一样,属于安全关键领域的大型复杂设备,对安全性、可靠性有着极高的要求。为保证稳定飞行,需要对目标对象进行实时跟踪,通过发出正确的修正偏差指令来操纵飞行器改变飞行姿态,因此对飞行器状态控制…

2024-03-13 作业

网络编程&#xff1a; 1.思维导图&#xff1a; 2.上课写的代码&#xff1a; 2.1网络字节序与主机字节序转换 运行代码&#xff1a; #include <myhead.h> int main() {int num 0x12345678;short int value 0x1234;int num_n htonl(num);int value_n htons(value);…

ISIS单区域实验简述

ISIS 中间系统到中间系统&#xff0c;也是链路状态协议&#xff0c;工作在数据链路层&#xff0c;不依赖IP地址&#xff1b;与OSPF一样采用最短路径SPF算法&#xff0c;收敛速度快。 实验基础配置&#xff1a; r1: sys sysname r1 undo info enable int g0/0/0 ip add 12.1.1.1…

jenkins 使用k8s插件连接k8s集群

jenkins 安装k8s 插件 配置k8s节点 填写k8s 配置信息 生成秘钥 在服务器上面 查看地址 cat /root/..kube/config 查看秘钥 -----BEGIN CERTIFICATE----- MIIDITCCAgmgAwIBAgIIGOkRkIVlo74wDQYJKoZIhvcNAQELBQAwFTETMBEGA1UE AxMKa3ViZXJuZXRlczAeFw0yNDAyMDgwNjAwMjdaFw…

王庆:当下股市过于悲观,A股、港股基本完成补跌和普跌过程,逆向布局时机已到

核心观点&#xff1a; 1、房地产对中国经济增长拖累最严重的时期正在过去...密切关注真正拐点的出现。 2、当前资本市场从价格表现上来讲&#xff0c;表现的远远超过了基本面所决定的悲观程度。 由于当前资本市场过于悲观&#xff0c;那么反过来就是孕育着机会。 3、我们判…

快速排序 刷题笔记

思路 分治双指针 在每个区间选定一个基准目标 两个指针从数组的两边向中间推进 使用 while循环判断 do {i;}while(q[i]<x); do{j--;}while(q[j]>x); 每次这样做完就会找到q[i]>x,,,,q[j]小于x 此时我们交换 q[i] ,q[j]于是小于x的数分到了小于x的一侧 大…

《详解:鸿蒙NEXT开发核心技术》

我们现在都知道鸿蒙作为一个国产的全栈自研系统&#xff0c;经过国家主推后。已经引起人们很大的关注&#xff0c;其中作为开发者来说&#xff1b;许多一线大厂已经与其华为鸿蒙展开原生应用的合作了&#xff0c;目前了解到已经有200家。而之后出现了很多的高薪鸿蒙开发岗位&am…

【数据库-黑马笔记】基础-SQL

本文参考b站黑马数据库视频,总结详细全面的笔记 ,可结合视频观看1~26集 MYSQL 的基础知识框架如下 目录 一、MYSQL概述 1、数据库相关概念 2、MYSQL的安装及启动 二、SQL 1、DDL【Data Defination】 2、DML【Data Manipulation】 ①、插入 ②、更新和删除 3、 DQL【Data…