0基础 三个月掌握C语言(11)

字符函数和字符串函数

为了方便操作字符和字符串 C语言标准库中提供了一系列库函数 接下来我们学习一下这些函数

字符分类函数

C语言提供了一系列用于字符分类的函数,这些函数定义在ctype.h头文件中。这些函数通常用于检查字符是否属于特定的类别,例如大写字母、小写字母、数字等。以下是一些常用的字符分类函数:

1.isalpha(int c): 检查字符c是否为字母(大写或小写)。

2.isupper(int c): 检查字符c是否为大写字母。

3.islower(int c): 检查字符c是否为小写字母。

4.isdigit(int c): 检查字符c是否为数字(0-9)。

5.isalnum(int c): 检查字符c是否为字母或数字。

6.isxdigit(int c): 检查字符c是否为十六进制数字(0-9,a-f,A-F)。

7.isspace(int c): 检查字符c是否为空白字符(例如空格、制表符、换行符等)。

8.ispunct(int c): 检查字符c是否为标点符号。

9.isgraph(int c): 检查字符c是否为图形字符(即非空格字符)。

10.isprint(int c): 检查字符c是否为可打印字符(包括图形字符和空格字符)。

11.iscntrl(int c): 检查字符c是否为控制字符(例如回车符、换行符等)。

这些函数通常接受一个int类型的参数,这是因为char类型在C语言中实际上是一个小的int类型。如果字符属于指定的类别  这些函数返回一个非零值(通常是1) 否则返回0。

这些函数的使⽤⽅法⾮常类似,我们就讲解⼀个函数的事情,其他的⾮常类似:

比如 函数islower 如果它的参数是小写字母 就返回非0的整数 如果不是小写字母 就返回0

练习:

写⼀个代码,将字符串中的⼩写字⺟转⼤写,其他字符不变。

当然我们没学上述字符分类函数也能做出来 只需要让小写字母-32即可

现在我们用字符分类函数来做

字符转换函数

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

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

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

之前的代码,我们将⼩写转⼤写,是-32完成的效果,有了转换函数,就可以直接使⽤ tolower函数。

长度不受限制的字符串函数

strlen的使用和模拟实现

函数原型:

字符串以'\0'作为结束标志,strlen函数返回的是在字符串中'\0'前⾯出现的字符个数(不包含'\0' )。

参数指向的字符串必须要以 '\0' 结束。

strlen的使⽤需要包含头⽂件#include<string.h> 

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

两个size_t(无符号的数)相减得到的结果仍然为无符号数 所以输出>

我们要是强转为int类型 即可得到想要的答案

学会strlen函数的模拟实现 

我们在之前也有学过

1.计数器的方式

2.指针-指针的方式

3.递归的方式(不创建临时变量count)

my_strlen(abcdedg)

1+my_strlen(bcdedg)

1+ (1+my_strlen(cdedg))

strcpy的使用和模拟实现

函数原型:

源字符串必须以 '\0' 结束。

会将源字符串中的 '\0' 拷⻉到⽬标空间。

⽬标空间必须⾜够⼤,以确保能存放源字符串。

⽬标空间必须可修改。(如果目标空间为常量字符串的时候 无法修改)

(如 char* arr2=xxxxxxxxx;)这里就无法修改目标空间arr2了

看下列代码:

接下来我们再给一段代码来看

看到调试的结果 我们就知道strcpy会将源字符串的’\0’拷贝到目标文件

strcpy模拟实现 

我们可以有一个更加简单的代码

我们模拟函数 尽可能去和原函数相像

strcat的使用和模拟实现

strcat函数的功能是拼接一个字符串到目标空间

函数原型:

源字符串必须以'\0'结束

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

⽬标空间必须有⾜够的⼤,能容纳下源字符串的内容

⽬标空间必须可修改

上代码:

strcat函数模拟实现

当然我们main函数内的my_strcat也可以修改一下  改成:

strcat可以在自己后面追加个自己吗

这里的while是死循环  造成越界访问 程序崩溃

因为这里的dest和src指针都指向arr1 当我们的dest找到了\0 后  此时src指向数组首元素 然后在dest所指的位置接上src位置上的字符   我们会发现src不会遇到\0  因为\0位置都被覆盖了 所以该循环是个死循环

如果遇到自己给自己追加 我们尽量不用strcat函数

strcmp的使用和模拟实现

函数原型:

标准规定:

第⼀个字符串⼤于第⼆个字符串,则返回⼤于0的数字

第⼀个字符串等于第⼆个字符串,则返回0

第⼀个字符串⼩于第⼆个字符串,则返回⼩于0的数字

那么如何判断两个字符串? ⽐较两个字符串中对应位置上字符ASCII码值的⼤⼩。

strcmp的使用

strcmp的模拟实现

当然我们也可以有另一种方式来比较字符串

这里的return *str1-*str2  当str1大于str2时就返回大于0的数

具体的数根据对应的字符的ASCII码的差值  这里的14就是q和c的ASCII码的差值

长度受限制的字符串函数

strncpy函数的使用

函数原型:

1.从源字符串拷贝num个字符到目标空间

2.如果源字符串的长度小于num  则拷贝完字符串之后 在目标的后边追加0  直到num个

当然如果我们这里的num值为8时 我们会在后面加两个’\0’来补空缺位置

strncat函数的使用

函数原型:

strncat函数的用途是将一个字符串(源字符串)的内容连接到另一个字符串(目标字符串)的末尾,但连接的字符数最多为指定的数量。

其中,destination(接下来用dest表示)是目标字符串,source(下面用src表示)是源字符串,num是要连接的字符数。

在连接过程中,strncat函数会检查src中的字符数。如果src中的字符数大于num,那么strncat只将src的前num个字符附加在dest末尾;如果src中的字符数小于num,那么strncat会将src的所有字符附加在dest末尾。

值得注意的是,dest需要有足够的空间来容纳要拷贝的字符串。另外,strncat函数会先将dest字符串最后的’\0’覆盖掉,然后在字符追加完成后,再追加’\0’。

注意:我们这边追加的’\0’和strncpy的补\0不一致 当然我们只要知道末尾会有\0就ok了

长度不受限制的字符串函数和长度受限制的字符串函数

长度受限制的字符串函数相对安全(并不是绝对安全)

例如上述代码 strcpy不会管会不会越界 会直接进行拷贝操作

strncmp的使用

函数原型:

比较str1和str2的前num个字符 如果相等就继续往后比较 最多比较num个字母 如果提前发现不一样 就提前结束 大的字符所在的字符串大于另外一个 如果num个字符都相等 就是相等 返回0

strstr的使用和模拟实现

函数原型:

在一个字符串中 查找另一个字符串

函数返回字符串str2在字符串str1中第一次出现的位置

字符串的比较匹配不包含\0字符  以\0作为结束标志

举例:

strstr的模拟实现

接下来我们来讲解在模拟实现中需要考虑的问题

1.最简单的情况

如str1=abcdef  str2=bcd

这里str1中并没有重复元素 当我们找到b 接着向下比较 直到找到str2的所有元素 最后输出bcdef

2.复杂情况(为什么需要cur指针)

如str1=abbbcdef  str2=bcd

这里就比较复杂了 当我们找到第一个b时 我们再向后找3个元素时 发现和str2不相等  如果没有cur指针指向移动前的所在位置(这里是第一个b所在位置) 此时s1已经指向str1中最后一个b 而s2指向str2中的d 这样我们就会导致无法正确查询在str1是否有和str2字符串相同的片段

3.如果str1=abc  str2=abc

这里我们知道字符串中有\0来结束 当s1和s2指向\0时 就已经结束了 如果接着向下搜寻 会导致越界访问 所以我的while循环里需要判断s1和s2是否为\0

4.注意这里的强制类型转换

这里有两种原因进行强制类型转换

首先是因为函数的返回值类型为char*

其次因为刚开始 我们设置成const char* 这样就无法对字符串进行操作了 这时强制类型转换是为了字符串的改变

5.特殊情况:当*cur找不到相同字符串时 即为空

strtok函数的使用

函数原型:

sep参数指向一个字符串 定义了用作分隔符的字符集合(该字符串是分隔符的集合)

第一个参数指向一个字符串 它包含了0个或者多个由sep字符串中一个或者多个分隔符分割的标记

strtok函数找到str中的下一个标记 并将其用\0结尾 返回一个指向这个标记的指针(注:strtok函数会改变被操作的字符串 所以被strtok函数切分的字符串一般都是临时拷贝的内容并且可修改)

strtok函数的第一个参数不为NULL  函数将找到str中第一个标记  strtok函数将保存它在字符串中的位置

strtok函数的第一个参数为NULL  函数将在同一个字符串中被保存的位置开始 查找下一个标记

如果字符串中不存在更多的标记 则返回NULL指针

接下来我们上代码来解释

strtok函数会把@和.变为\0  第一个参数为arr2(不为NULL)  函数保存第一个标记所在字符串中的位置 如果再次调用时 我们要传NULL  函数将在同一个字符中被保存的位置开始 查找下一标记

这里我们可能就会想 这函数这么复杂 有什么用 其实我们上述代码只是为了让大家理解该函数 接着我们上一个代码 让大家感受一下strtok函数

这里仅仅一个for循环就把我们之前写的那么多行代码给替换了 所以每个函数只要我们会用 它就是有用的 但该函数用的还是比较少 大家理解 掌握即可

strerror的使用

函数原型:

strerror函数可以把参数部分错误码对应的错误信息的字符串地址返回来

在不同的系统和C语言标准库的实现中都规定了一些错误码  一般是放在errno.h这个头文件中说明的  C语言程序启动的时候就会使用一个全局的变量errno来记录程序的当前错误码  只不过程序启动的时候errno是0  表示没有错误  当我们在使用标准库中的函数的时候发生了某种错误  就会将对应的错误码  存放在errno中 每一个错误码都有对应的错误信息的  strerror函数就可以将错误对应的错误信息字符串的地址返回

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

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

相关文章

阿里EMO模型:AI生成表情丰富的视频

引言 在数字多媒体的时代&#xff0c;人们对于互动性和个性化视频内容的需求不断增长。阿里巴巴的EMO&#xff08;Emote Portrait Alive&#xff09;模型&#xff0c;作为一项前沿的人工智能技术&#xff0c;正引领着这一领域的革新之路。 EMO模型概述 EMO模型是阿里巴巴智能计…

linux下重启ORACLE

切换到oracle用户 su - oracle 登录oracle sqlplus / as sysdba 启动数据库 startup 退出数据库 exit 启动监听 lsnrctl start FINISH

论文阅读——Rein

Stronger, Fewer, & Superior: Harnessing Vision Foundation Models for Domain Generalized Semantic Segmentation 一、引言 是一个对Domain Generalized Semantic Segmentation (DGSS)任务的视觉大模型的微调方法&#xff0c;即Rein。 Rein 专为 DGSS 任务量身定制&a…

matlab 眼球图像处理血管提取

1、内容简介 略 69-可以交流、咨询、答疑 2、内容说明 眼球图像处理血管提取 lab颜色空间提取眼球边缘、形态学操作 八邻域搜索算法 pUnImage&#xff0c;任意一点的坐标记为p(x,y),该点周围八邻域点的坐标记为p0(x,y)&#xff0c;p1(x,y)&#xff0c;p2(x,y)&#xff0c;…

利用express从0到1搭建后端服务

目录 步骤一&#xff1a;安装开发工具步骤二&#xff1a;安装插件步骤三&#xff1a;安装nodejs步骤四&#xff1a;搭建启动入口文件步骤五&#xff1a;启动服务器总结 在日常工作中&#xff0c;有很多重复和繁琐的事务是可以利用软件进行提效的。但每个行业又有自己的特点&…

【Redis】基于Redis实现查询缓存

1.缓存更新策略 主动更新用的最多。  主动更新一般是由缓存的调用者&#xff0c;在更新数据库的同时&#xff0c;更新缓存。 操作缓存和数据库时有三个问题需要考虑&#xff1a; 删除缓存还是更新缓存&#xff1f; 更新缓存&#xff1a;每次更新数据库都更新缓存&#xff0…

mac电脑修改终端zsh显示的用户名

电脑名称一直没有修改&#xff0c;所以电脑名称都是Apple的MacBook Pro&#xff0c;如下图所示&#xff1a; mac电脑终端显示用户名太长一点也不美观&#xff0c;而且占用很长的行&#xff0c;浪费空间&#xff0c;可以通过修改来调整要显示什么内容&#xff1a; 方式一 要想换…

2核4g服务器够用吗?

2核4G服务器够用吗&#xff1f;够用。阿腾云以2核4G5M服务器搭建网站为例&#xff0c;5M带宽下载速度峰值可达640KB/秒&#xff0c;阿腾云以搭建网站为例&#xff0c;假设优化后平均大小为60KB&#xff0c;则5M带宽可支撑10个用户同时在1秒内打开网站&#xff0c;并发数为10&am…

Day66:WEB攻防-Java安全SPEL表达式SSTI模版注入XXEJDBCMyBatis注入

目录 JavaSec搭建 Hello-Java-Sec搭建 Java安全-SQL注入-JDBC&MyBatis Java安全-XXE注入-Reader&Builder Java安全-SSTI模版-Thymeleaf&URL Java安全-SPEL表达式-SpringBoot框架 知识点&#xff1a; 1、Java安全-SQL注入-JDBC&MyBatis 2、Java安全-XXE注…

综合实验---Web---进阶版

实验配置&#xff1a; 7-1为内网Nginx服务器&#xff1b;7-2和7-3为Web服务器&#xff1b;7-4为网关服务器&#xff1b;7-5为外网客户机&#xff1b; yum安装Nginx&#xff1b;yum安装Mysql&#xff1b; 编译安装PHP&#xff1b;编译安装 由于我们Nginx和Mysql都是yum安装&…

同城预约上门服务APP小程序开发 打造快捷便利生活

随着移动互联网的快速发展&#xff0c;人们的生活方式正在发生深刻的变化。特别是在城市生活中&#xff0c;人们越来越依赖移动应用来解决日常生活中的各种问题。其中&#xff0c;同城预约上门服务APP正成为一种新型的生活服务平台&#xff0c;为人们提供了更加便利和快捷的服务…

腾讯云图形验证码的PHP示例

需要准备的 1.API密钥 SecretId 及 SecretKey 两部分&#xff0c; SecretId 用于标识 API 调用者的身份&#xff0c; SecretKey 用于加密签名字符串和服务器端验证签名字符串的密钥。 前往API密钥管理页面&#xff0c;即可进行获取 https://console.cloud.tencent.com/cam/ca…

idea将非UTF-8的properties修改为UTF-8编码的文件

需求背景 由于项目初始化时&#xff0c;properties文件的编码格式为ASCII编码格式&#xff0c;此时用idea打开该文件会默认展示UTF-8的编码内容&#xff0c;其中汉字可以正常展示&#xff0c;但是使用notepad打开却依旧时ASCII编码格式 idea配置 打开idea-setting-editor-f…

【MySQL】5. 数据类型

数据类型 1. 数据类型分类 2. 数值类型 2.1 tinyint类型 数值越界测试&#xff1a; mysql> use tt; Database changed mysql> create table t1(-> num tinyint-> ); Query OK, 0 rows affected (0.01 sec)mysql> insert into t1 values(-128); Query OK, 1 r…

Day40:安全开发-JavaEE应用SpringBoot框架JWT身份鉴权打包部署JARWAR

目录 SpringBoot-身份鉴权-JWT技术 SpringBoot-打包部署-JAR&WAR 思维导图 Java知识点 功能&#xff1a;数据库操作&#xff0c;文件操作&#xff0c;序列化数据&#xff0c;身份验证&#xff0c;框架开发&#xff0c;第三方组件使用等. 框架库&#xff1a;MyBatis&…

SQLiteC/C++接口详细介绍之sqlite3类(十三)

返回目录&#xff1a;SQLite—免费开源数据库系列文章目录 上一篇&#xff1a;SQLiteC/C接口详细介绍之sqlite3类&#xff08;十二&#xff09; 下一篇&#xff1a;SQLiteC/C接口详细介绍之sqlite3类&#xff08;十四&#xff09;&#xff08;未发表&#xff09; 40.sqlite3…

深入探讨医保购药APP的技术架构与设计思路

随着移动互联网的发展&#xff0c;医疗保健行业也迎来了数字化转型的浪潮。医保购药APP作为医保体系数字化的一部分&#xff0c;其技术架构和设计思路至关重要。接下来&#xff0c;小编将为您讲解医保购药APP的技术架构与设计思路&#xff0c;为相关从业者提供参考和启发。 一、…

51单片机基础篇系列-定时/计数器的控制工作方式

&#x1f308;个人主页&#xff1a;会编程的果子君 &#x1f4ab;个人格言:“成为自己未来的主人~” 定时/计数器的控制 80C51单片机定时/计数器的工作由两个特殊功能寄存器控制&#xff0c;TMOD用于设置其工作方式&#xff1a; 1.工作方式寄存器TMOD 工作方式寄存器TMO…

Rust学习02:推荐一本入门书,免费的

都说Rust的学习曲线很陡峭&#xff0c;试过才知雀实不容易。 先说我的基础&#xff0c;非科班&#xff0c;自学Python&#xff0c;写过几个小程序。 我买书从来不扣扣嗖嗖的&#xff0c;所以先啃了几本Rust的入门书&#xff0c;包括&#xff1a; Tim McNamara的《Rust实战》&am…

inux(CentOS)/Windows-C++ 云备份项目(项目文件操作工具类设计,完成项目基本文件操作-读写-压缩-目录操作)

文章目录 1. 项目文件操作工具类设计 1. 项目文件操作工具类设计 根据前面的分析&#xff0c;这个文件类的基本属性如下&#xff1a; 文件大小信息文件最后修改时间文件最后一次访问时间&#xff0c;方便文件的热点管理文件名称&#xff0c;需要从http 请求行上的uri中获取基…