字符函数和字符串函数(上)

目录

  • 字符分类函数
  • 字符转换函数
  • strlen(Get string length)的使用和模拟实现
  • strcpy(Copy string)的使用和模拟实现
  • strcat(Concatenate strings)的使用和模拟实现
  • strcmp(Compare two strings)的使用和模拟实现

感谢各位大佬对我的支持,如果我的文章对你有用,欢迎点击以下链接
🐒🐒🐒个人主页
🥸🥸🥸C语言
🐿️🐿️🐿️C语言例题
🐣🐓🏀python

字符分类函数

C语言中有一系列的函数是专门做字符分类的,也就是一个字符是属于什么类型的字符的。
这些函数的使用都需要包含一个头文件是ctype.h
这些函数的使用方法非常类似,我们就讲解一个函数的事情,其他的非常类似:

 int islower ( int c );

islower 是能够判断参数部分的c是否是小写字母的。
通过返回值来说明是否是小写字母,如果是小写字母就返回非0的整数,如果不是小写字母,则返回0。
我们举个例子来演示一下:写一个代码,将字符串中的小写字母转大写,其他字符不变。

#include <stdio.h>
#include <ctype.h>
int main()
{int i = 0;char str[] = "Test String.\n";char c;while (str[i]){c = str[i];if (islower(c))c -= 32;//依据ASCLL码表进行的计算putchar(c);i++;}return 0;
}

解析:
str是一个数组,数组里的元素是一个字符串,while(str[i])是为了判断str[i]是否为\0,如果不是\0就进行接下来的操作,否则就不执行while语句

我们将str[i]的值赋给字符变量c,通过if语句用islower来判断c是否为小写字符,如果islower©返回的值为非0的数就是小写字母,否则就不是小写字母,因为if语句中括号内如果为非0就是真,所以会执行if语句,如果为0则为假,就不会执行if语句

执行完后通过putchar输出字符c,再i++判断下一个字符

字符转换函数

C语言提供了2个字符转换函数:

int tolower ( int c ); //将参数传进去的小写字母转大写
int toupper ( int c ); //将参数传进去的大写字母转小写

上面的代码,我们将小写转大写,是-32完成的效果,有了转换函数,就可以直接使用 tolower 函数。

#include <stdio.h>
#include <ctype.h>
int main()
{int i = 0;char str[] = "Test String.\n";char c;while (str[i]){c = str[i];if (islower(c))c = toupper(c);putchar(c);i++;}return 0;
}

strlen(Get string length)的使用和模拟实现

size_t strlen ( const char * str );

strlen模拟实现重点:
1:字符串以 ‘\0’ 作为结束标志,strlen函数返回的是在字符串中’\0’ 前面出现的字符个数(不包含 ‘\0’ )

2:参数指向的字符串必须要以 ‘\0’ 结束

3:注意函数的返回值为size_t,是无符号的( 易错 )

模拟实现代码:

法一(记录次数)
int my_strlen(const char* str)
{int count = 0;assert(str);while (*str){count++;str++;}return count;
}

解析:
这个代码相对比较简单,我们设一个变量count=0,通过while循环,如果str没有到\0就str++

然后用count++记录执行了多少次循环,当str是\0时,while括号内部就是0为假,就返回count

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

解析:
递归这里就比较难想到,assert断言判断s传入的指针是否有问题,这是一个好习惯

通过if语句判断str是否为\0(这里就是限制条件),如果不是\0就返回1+my_strlen(str + 1)

str+1就是为了接近限制条件*str==‘\0’,每加一次1就往后移动一个字符元素,知道为\0,最后回归,返回我们所需要的数

法三(指针相减)
int my_strlen(char* s)
{assert(str);char* p = s;while (*p != '\0')p++;return p - s;
}

解析:
指针相减也比较难想到,我们设一个字符指针p=s,p是s首元素的地址

我们让p指向的地址一直往后移,直到是\0,这时我们通过指针相减,就能计算出相差多少个元素了

strcpy(Copy string)的使用和模拟实现

char* strcpy(char * destination, const char * source );

strcpy模拟实现重点:
1:源字符串必须以 ‘\0’ 结束

2:会将源字符串中的 ‘\0’ 拷贝到目标空间

3:目标空间必须足够大,以确保能存放源字符串。

4:目标空间必须可变

我们对上面的重点解释一下
strcpy是将一个字符串拷贝到另一个字符串,所以源字符串必须以\0结尾

我们假设要拷贝进的字符串为a,另一个字符串为b,由于我们拷贝的目的是要让b中的字符完全和a相同,我们知道\0是一个字符串的结尾,当我们将a中的\0拷贝进去后,b后面的字符就相当于切断了,所以必须将源字符串中的\0拷贝进去

当然了目标空间也一定要大,否则容纳不下a,就无法拷贝进去

因为要拷贝进去,如果目标空间不可变那还拷贝什么

strcpy的模拟实现

//模拟实现需要注意的点
//1.参数顺序
//2.函数的功能,停⽌条件
//3.assert
//4.const修饰指针
//5.函数返回值
//题⽬出⾃《⾼质量C/C++编程》书籍最后的试题部分
char* my_strcpy(char* dest, const char* src)
{char* ret = dest;assert(dest != NULL);assert(src != NULL);while ((*dest++ = *src++)){;}return ret;
}

解析:

通过断言判断目标地址和需要拷贝进去的地址是否为空指针

while循环括号中的部分就非常妙了,二者都是后置++,就是先用后++,使src的每个字符都拷贝进了dest

strcat(Concatenate strings)的使用和模拟实现

strcat模拟实现重点:

1:源字符串必须以 ‘\0’ 结束

2:目标字符串中也得有 \0 ,否则没办法知道追加从哪里开始

3:目标空间必须有足够的大,能容纳下源字符串的内容

4:目标空间必须可修改

我们对上面的重点进行解释一下:
追加字符串后我们会得到一个新的字符串,因为每个字符串都需要用\0来结尾,所以源字符串就需要以\0结尾

追加字符串我们都是追加在目标字符串最末尾(也就是\0的位置),将需要追加的字符串替换\0就得到我们所需要的字符串

如果目标空间不足够大的话我们追加的字符串就装不下,就会出问题

因为追加就相当于改变目标空间的储存内容,所以目标空间必须可改变

char* my_strcat(char* dest, const char* src)
{char* ret = dest;assert(dest != NULL);assert(src != NULL);while (*dest){dest++;}while ((*dest++ = *src++)){;}return ret;
}

解析:

第一个while循环是为了找到\0的位置,方便追加字符串

第二个while其实就是将源字符串追加到目标字符串

strcmp(Compare two strings)的使用和模拟实现

strcmp模拟实现重点:
第一个字符串大于第二个字符串,则返回大于0的数字

第一个字符串等于第二个字符串,则返回0

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

比较两个字符串中对应位置上字符ASCII码值的大小

strcmp函数的模拟实现:

int my_strcmp(const char* str1, const char* str2)
{int ret = 0;assert(src != NULL);assert(dest != NULL);while (*str1 == *str2){if (*str1 == '\0')return 0;str1++;str2++;}return *str1 - *str2;
}

解析:

我们需要分情况讨论
1:如果一开始str1!=str2,我们其实就可以直接判断str1和str2直接的大小了(注意strcmp的比较是每个字符之间的比较,否则无法比较)

2:如果一开始str1=str2,那么我们就可以通过str1++和str2++来进行判断下一个字符是否相等

3:此外在(2)的基础上如果str1已经等于\0我们就没必要比较后面的字符了,直接返回0表示str1前面的字符和str2前面的字符相等

4:如果不相等我们就返回两个字符相减(两字符相减我们可以通过ASCLL码计算)

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

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

相关文章

留住时光、固化时间、让一瞬成为永恒——全新的真人手办定制模式,就选易模小程序制作。

如何能永远留住一瞬间&#xff1f; 有人说我可以拍摄一张照片&#xff0c;照片的问世确实给生活中许多美好的瞬间留下了可以记录的工具。但是随着时间的流逝&#xff0c;照片终究也会泛黄&#xff0c;似乎有一些记忆的温度&#xff0c;有一些岁月的棱角&#xff0c;也是照片所给…

SD卡格式化怎么恢复?

随着智能手机、平板电脑、数码相机和行车记录仪等各种移动电子设备走入千家万户&#xff0c;SD卡作为与这些设备相配套的存储介质&#xff0c;也随之获得了广泛的市场认可。SD卡因其体积小巧、容量庞大、读写速度高及与多种设备兼容的优点&#xff0c;逐渐成为日常工作和生活中…

怒刷LeetCode的第23天(Java版)

目录 第一题 题目来源 题目内容 解决方法 方法一&#xff1a;贪心算法 方法二&#xff1a;动态规划 方法三&#xff1a;回溯算法 方法四&#xff1a;并查集 第二题 题目来源 题目内容 解决方法 方法一&#xff1a;排序和遍历 方法二&#xff1a;扫描线算法 方法…

StarRocks数据导入

1、相关环境 Flink作为当前流行的流式计算框架&#xff0c;在对接StarRocks时&#xff0c;若直接使用JDBC的方式"流式"写入数据&#xff0c;对StarRocks是不友好的&#xff0c;StarRocks作为一款MVCC的数据库&#xff0c;其导入的核心思想还是"攒微批降频率&qu…

HTTP协议,请求响应

、概述 二、HTTP请求协议 三、HTTP响应协议 四、请求数据 1.简单实体参数 RequestMapping("/simpleParam")public String simpleParam(RequestParam(name "name" ,required false ) String username, Integer age){System.out.println (username "…

车牌文本检测与识别:License Plate Recognition Based On Multi-Angle View Model

论文作者&#xff1a;Dat Tran-Anh,Khanh Linh Tran,Hoai-Nam Vu 作者单位&#xff1a;Thuyloi University;Posts and Telecommunications Institute of Technology 论文链接&#xff1a;http://arxiv.org/abs/2309.12972v1 内容简介&#xff1a; 1&#xff09;方向&#x…

可以动态改变刻度背景色的车速仪表盘

最近做的项目的主页面需要用到一个仪表盘来动态显示车速&#xff0c;同时改变对应的背景色 仪表盘 开始是想着使用echarts&#xff0c;修修改改拿来用&#xff0c;但是人家客户有规定&#xff0c;必须搞个差不多的&#xff0c;那没办法&#xff0c;自 己动手搞个吧 截图如下&am…

多源最短路径的原理及C++实现

时间复杂度 O(n3),n是端点数。 核心代码 template<class T, T INF 1000 * 1000 * 1000> class CNeiBoMat { public: CNeiBoMat(int n, const vector<vector<int>>& edges,bool bDirectfalse,bool b1Base false) { m_vMat.assign(n, vector<…

2023年【R2移动式压力容器充装】模拟考试及R2移动式压力容器充装模拟考试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 R2移动式压力容器充装模拟考试考前必练&#xff01;安全生产模拟考试一点通每个月更新R2移动式压力容器充装模拟考试题题目及答案&#xff01;多做几遍&#xff0c;其实通过R2移动式压力容器充装操作证考试很简单。 1…

MySQL5.7版本与8.0版本在Ubuntu(WSL环境)系统安装

目录 前提条件 1. MySQL5.7版本在Ubuntu&#xff08;WSL环境&#xff09;系统安装 1. 1 下载apt仓库文件 1.2 配置apt仓库 1.3 更新apt仓库的信息 1.4 检查是否成功配置MySQL5.7的仓库 5. 安装MySQL5.7 1.6 启动MySQL 1.7 对MySQL进行初始化 1.7.1 输入密码 …

PDF文件压缩软件 PDF Squeezer mac中文版​软件特点

PDF Squeezer mac是一款macOS平台上的PDF文件压缩软件&#xff0c;可以帮助用户快速地压缩PDF文件&#xff0c;从而减小文件大小&#xff0c;使其更容易共享、存储和传输。PDF Squeezer使用先进的压缩算法&#xff0c;可以在不影响文件质量的情况下减小文件大小。 PDF Squeezer…

排序算法之【快速排序】

&#x1f4d9;作者简介&#xff1a; 清水加冰&#xff0c;目前大二在读&#xff0c;正在学习C/C、Python、操作系统、数据库等。 &#x1f4d8;相关专栏&#xff1a;C语言初阶、C语言进阶、C语言刷题训练营、数据结构刷题训练营、有感兴趣的可以看一看。 欢迎点赞 &#x1f44d…

[sping] spring core - 依赖注入

[sping] spring core - 依赖注入 所有代码实现基于 Spring Boot3&#xff0c;core 的概念很宽广&#xff0c;这里的 core concept 主要指的就是 Inversion of Control 和 Dependency Injection&#xff0c;其他的按照进度应该是会被放到其他的 section 记录 之前有写过 IoC 和…

MARS: An Instance-aware, Modular and Realistic Simulator for Autonomous Driving

MARS: An Instance-aware, Modular and Realistic Simulator for Autonomous Driving&#xff08;基于神经辐射场的自动驾驶仿真器&#xff09;https://github.com/OPEN-AIR-SUN/marshttps://arxiv.org/pdf/2307.15058.pdfhttps://mp.weixin.qq.com/s/6Ion_DZGJwzs8JOoWMMbPw …

Ubuntu基于Docker快速配置GDAL的Python、C++环境

本文介绍在Linux的Ubuntu操作系统中&#xff0c;基于Docker快速配置Python与C 这2种不同编程语言可用的地理数据处理库GDAL开发环境的方法。 本文就将Python与C 这2种不同编程语言的GDAL模块配置方法分开来介绍&#xff0c;大家依据自己的需求来选择即可——但无论是哪种方法&a…

计算机竞赛 目标检测-行人车辆检测流量计数

文章目录 前言1\. 目标检测概况1.1 什么是目标检测&#xff1f;1.2 发展阶段 2\. 行人检测2.1 行人检测简介2.2 行人检测技术难点2.3 行人检测实现效果2.4 关键代码-训练过程 最后 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 行人车辆目标检测计数系统 …

springmvc-JSR303进行服务端校验分组验证SpringMVC定义Restfull接口异常处理流程RestController异常处理

目录& 1. JSR303 2. JSR303中含有的注解 3. spring中使用JSR303进行服务端校验 3.1 导入依赖包 3.2 添加验证规则 3.3 执行校验 4. 分组验证 4.1 定义分组验证规则 4.2 验证时通过参数指定验证规则 4.3 验证信息的显示 5. SpringMVC定义Restfull接口 5.1 增加s…

opentelemetry、grafana、Prometheus、jaeger、victoria-metrics 介绍、关系与使用

Opentelemetry OTEL 是 OpenTelemetry 的简称&#xff0c; 是 CNCF 的一个可观测性项目&#xff0c;旨在提供可观测性领域的标准化方案&#xff0c;解决观测数据的数据模型、采集、处理、导出等的标准化问题&#xff0c;提供与三方 vendor 无关的服务。 OpenTelemetry 是一组标…