C语言 | 字符函数和字符串函数

目录:

1. 字符分类函数

2. 字符转换函数

3. strlen的使用和模拟实现

4. strcpy的使用和模拟实现

5. strcat的使用和模拟实现

6. strcmp的使用和模拟实现

7. strncpy函数的使用

8. strncat函数的使用

9. strncmp函数的使用

10. strstr的使用

11. strtok函数的使用

12. strerror函数的使用


在编程的过程中,我们经常要处理字符和字符串,为了⽅便操作字符和字符串,C语⾔标准库中提供了 ⼀系列库函数,接下来我们就学习⼀下这些函数。

1. 字符分类函数

C语⾔中有⼀系列的函数是专门做字符分类的,也就是⼀个字符是属于什么类型的字符的。 这些函数的使用都需要包含⼀个头文件是 ctype.h

b2525feee1ff434f85bc7553737cea87.png

这些函数的使用方法非常类似,我们就讲解⼀个函数,其他的非常类似:

int islower ( int c );

 islower

能够判断参数部分的 c 是否是小写字母的。 通过返回值来说明是否是小写字母,如果是小写字母就返回非0的整数,如果不是小写字母,则返回 0。

练习: 写⼀个代码,将字符串中的小写字母转大写,其他字符不变。

b6dd95f1cbdc467faf7f3704cb7ca877.png

2. 字符转换函数

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

int tolower ( int c ); //将参数传进去的⼤写字⺟转⼩写 
int toupper ( int c ); //将参数传进去的⼩写字⺟转⼤写

同样是上面的问题,将字符串中的小写字母转大写,有了转换函数,就可以直接使⽤ tolower 函 数。为:

c866ef8b99ea4675acb3d0306ce75671.png

3. strlen的使用和模拟实现 

size_t strlen ( const char * str );

• 字符串以 '\0' 作为结束标志,strlen函数返回的是在字符串中 '\0' 前面出现的字符个数

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

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

• strlen的使用需要包含头文件<string.h>

------判断下面代码会输出什么结果?

#include <stdio.h>
#include <string.h>
int main()
{const char* str1 = "abcdef";const char* str2 = "bbb";if(strlen(str2)-strlen(str1)>0){printf("str2>str1\n");} else{printf("srt1>str2\n");}return 0;
}

 结果为:

39ca832c0082454f866237cc046eb95b.png

因为 函数的返回值为size_t,是无符号的!!

• 学会strlen函数的模拟实现 

方式1:

//计数器⽅式
int my_strlen(const char * str)
{int count = 0;assert(str);while(*str){count++;str++;}return count;
}

方式2:

//不能创建临时变量计数器
int my_strlen(const char * str)
{assert(str);if(*str == '\0')return 0;elsereturn 1+my_strlen(str+1);
}

方式3:

//指针-指针的⽅式
int my_strlen(char *s)
{assert(str);char *p = s;while(*p != ‘\0’ )p++;return p-s;
}

4. strcpy 的使用和模拟实现

char* strcpy(char * destination, const char * source );//   目的地   <-------------- 来源 

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

• 会将源字符串中的 '\0' 拷贝到目标空间。

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

• 目标空间必须可修改。

用于拷贝字符串,简单使用:

25ebf6d1216a4b63b169386237d4bead.png

strcpy的模拟实现:

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

5. strcat 的使用和模拟实现

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

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

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

• 目标空间必须有足够的⼤,能容纳下源字符串的内容。

• 目标空间必须可修改

用于连接字符串,简单使用:

d0919112d6d744dda7076ac01925f8bc.png

strcat的模拟实现:

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

6. strcmp 的使用和模拟实现

int strcmp (const char * str1, const char * str2)

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

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

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

•那么如何判断两个字符串? 比较两个字符串中对应位置上字符ASCII码值的大小。

简单使用:

edbb8b5313864e3cb705a74fc2113b07.png

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

strcpy,strcat,strcmp为长度不受限制的字符串函数

strncpy,strncat,strncmp为长度受限制的字符串函数

7. strncpy函数的使用

char * strncpy ( char * destination, const char * source, size_t num );

拷贝num个字符从源字符串到⽬标空间

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

简单使用:

ab03f2786c2b4704a79753556a31b82d.png

8. strncat 函数的使用 

char * strncat ( char * destination, const char * source, size_t num );

 • 将source指向字符串的前num个字符追加到destination指向的字符串末尾,再追加⼀个 \0 字符

 • 如果source 指向的字符串的长度小于num的时候,只会将字符串中到 \0 的内容追加到destination指向的字符串末尾

简单使用:

84570f4961ef41f288e6691b386c54b0.png

dbc4dd8cda624bb6979c4278439dec04.png

9. strncmp函数的使用

int strncmp ( const char * str1, const char * str2, size_t num );

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

简单使用:

8eca28b7ab764f7ba9785703fceb3f02.png

10. strstr 的使用和模拟实现

char * strstr ( const char * str1, const char * str2);

//从一个字符串str1中查找另一个字符串str2 

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

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

简单使用:

8b3e73d5c9684571b3846b53e3980d12.png

未找到返回空指针

508ba7a8cc7643e9839f95ab3cf4a054.png

11. strtok 函数的使用

char * strtok ( char * str, const char * sep);

• sep参数指向⼀个字符串,定义了⽤作分隔符的字符集合

• 第⼀个参数指定⼀个字符串,它包含了0个或者多个由sep字符串中⼀个或者多个分隔符分割的标 记。

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

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

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

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

简单使用:

5dd6825416db491ea59b5a7a377ab8cd.png

12. strerror 函数的使用

char * strerror ( int errnum );

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

在不同的系统和C语⾔标准库的实现中都规定了⼀些错误码,⼀般是放在 errno.h 这个头⽂件中说明 的,C语⾔程序启动的时候就会使用⼀个全⾯的变量errno来记录程序的当前错误码,只不过程序启动 的时候errno是0,表⽰没有错误,当我们在使⽤标准库中的函数的时候发生了某种错误,就会讲对应 的错误码,存放在errno中,而⼀个错误码的数字是整数很难理解是什么意思,所以每⼀个错误码都是 有对应的错误信息的。strerror函数就可以将错误对应的错误信息字符串的地址返回。

在Windows11+VS2022环境下输出的结果如下

52067c58c7b444998802aede97c8ab73.png

举例:

735337586e80440b8bac6dd13592297d.png

也可以了解⼀下perror函数,perror函数相当于⼀次将上述代码中的第9行完成了,直接将错误信息打 印出来。perror函数打印完参数部分的字符串后,再打印⼀个冒号和⼀个空格,再打印错误信息。

6e9529e353f440178727141f2a2ae9b4.png

分享到这里,感谢观看

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

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

相关文章

智慧公厕:城市管理的一大创新

公共厕所作为城市基础设施的重要组成部分&#xff0c;不仅仅是提供方便的厕所&#xff0c;更是城市管理的一项创新。随着科技的发展&#xff0c;智慧公厕应运而生。通过物联网、大数据、云计算、网络通信、自动化控制等技术&#xff0c;智慧公厕实现了对公厕内部人体活动状态、…

【算法刷题day22】Leetcode:235. 二叉搜索树的最近公共祖先、701. 二叉搜索树中的插入操作、450. 删除二叉搜索树中的节点

文章目录 Leetcode 235. 二叉搜索树的最近公共祖先解题思路代码总结 Leetcode 701. 二叉搜索树中的插入操作解题思路代码总结 Leetcode 450. 删除二叉搜索树中的节点解题思路代码总结 草稿图网站 java的Deque Leetcode 235. 二叉搜索树的最近公共祖先 题目&#xff1a;235. 二…

JD抓包 | 安卓app抓包

去年11月份左右搞过一次安卓抓包, 搞了很久试了很多方法, 才弄好. 时隔半年, 安卓抓包依然是令我头疼的问题 这次简单记录一下过程(细节太多我也说不清) JD的有效信息接口通常是以下这样的, 其他的接口并没有返回太多"有用"的信息 https://api.m.jd.com/client.act…

Composite 组合

意图 将对象组合成树形结构以表示“部分-整体”的层级结构。Composite使得用户对单个对象和组合对象的使用具有一致性。 结构 其中&#xff1a; Component为组合中的对象声明接口&#xff1b;在适当情况下实现所有类共有接口的默认行为&#xff1b;声明一个接口用于访问和管…

Java基础(二)-- 面向对象

文章目录 第二章、面向对象一、类和对象1、基本概念1&#xff09;什么是对象2&#xff09;什么是面向对象3&#xff09;什么是类4&#xff09;什么是对象的属性和方法5&#xff09;类和对象的关系 2、单一职责原则3、对象实例化1&#xff09;Java内存管理之堆和栈 4、构造方法5…

LeetCode题练习与总结:有效数字--65

一、题目描述 有效数字&#xff08;按顺序&#xff09;可以分成以下几个部分&#xff1a; 1. 一个 小数 或者 整数 2. &#xff08;可选&#xff09;一个 e 或 E &#xff0c;后面跟着一个 整数 小数&#xff08;按顺序&#xff09;可以分成以下几个部分&#xff1a; 1. &…

串及BF算法

一.串的相关定义 1.字符串的拷贝,比较,链接等等(C语言) 2 串:用 引起来的字符序列,例如abcd (区别字符串"abcd") 3.空串: (区别字符串"") 4.子串:包含空串和本身,abc的子串:,a,b,c,ab,bc,abc7个 5.真子串:包含空串,不包含本身,abc的子串:,a,b,c,a…

自动驾驶仿真测试的难点

自动驾驶仿真测试是自动驾驶车辆商业化落地的一道重要关卡&#xff0c;仿真测试技术的发展进步将决定自动驾驶落地的时间点。 仿真测试对自动驾驶的重要性不言而喻&#xff0c;笔者写这些内容希望能够抛转引玉。更希望能够作为一个“呐喊者”让更多的人去关注和重视自动驾驶仿…

一条命令把视频和字幕合并成一个文件

ffmpeg -i input_video.mp4 -i input_subtitles.ass -c:s mov_text -c:v copy -map 0:v -map 0:a -map 1:s output_video.mp4 参数说明&#xff1a; -i input_video.mp4 指定输入视频文件。 -i input_subtitles.ass 指定输入的字幕文件。 -c:s mov_text 指定字幕编码器为mov…

【LeetCode: 705. 设计哈希集合 + 数据结构设计】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

Qt快速入门(MV架构之TableView + QStandardItemModel + 自定义代理小案例)

Qt快速入门&#xff08;MV架构之TableView QStandardItemModel 自定义代理小案例&#xff09; 关于MV架构的简单介绍 在Qt框架中&#xff0c;代理&#xff08;Delegate&#xff09;、模型&#xff08;Model&#xff09;和视图&#xff08;View&#xff09;之间的关系构成了…

【数据工具】ArcGIS批量出图工具箱

工具下载链接&#xff1a;数据下载链接 我们在使用Arcgis制图的过程中&#xff0c;经常会遇到需要大量出图的情况&#xff0c;如何将做好的图批量导出jpg是一件令人头疼的问题。 今天小编就给大家分享俩个ArcGIS批量出图的工具箱&#xff0c;一个可以批量导出图层为jpg&#…

Java-Scanner类进阶+题目

Scanner进阶 接收整数数据时&#xff1a; 接收小数数据时&#xff1a; 例子&#xff1a; 可以先这样弄出scanner的框架&#xff1a; 未完待续... ...

科技论文和会议录制高质量Presentation Video视频方法

一、背景 机器人领域&#xff0c;许多高质量的期刊和会议&#xff08;如IEEE旗下的TRO&#xff0c;RAL&#xff0c;IROS&#xff0c;ICRA等&#xff09;在你的论文收录后&#xff0c;需要上传一个Presentation Video材料&#xff0c;且对设备兼容性和视频质量有较高要求&#…

2024年DTC的回顾与思考

刚结束了2024的数据库技术嘉年华 这是我从2017年开始就参加的技术大会。中途因为疫情的耽误。正常来说我是连续的。知道我的朋友都知道我习惯炫耀一下。 按照惯例&#xff0c;此时此刻群友都在写大会回顾。只是有几个不讲武德的人已经发送了。下面有主观和客观的分析。 主观上…

手机银行客户端框架之TMF框架介绍

腾讯移动开发平台&#xff08;Tencent Mobile Framework&#xff09;整合了腾讯在移动产品中开发、测试、发布和运营的技术能力&#xff0c;为企业提供一站式、覆盖全生命周期的移动端技术平台。核心服务包括移动客户端开发组件、H5容器、灰度发布、热更新、离线包、网关服务、…

LeetCode-15-三数之和问题

题目说明 给定一个包含 n 个整数的数组 nums&#xff0c;判断 nums 中是否存在三个元素 a&#xff0c;b&#xff0c;c &#xff0c;使得 a b c 0 &#xff1f;找出所有满足条件且不重复的三元组。 注意&#xff1a;答案中不可以包含重复的三元组。 给定数组 nums [-1, 0,…

Vol.41 SEO基本术语解释

1.TDK TDK&#xff1a;即标题、描述、关键词&#xff1b;TDK是网站的基本属性&#xff0c;对SEO非常重要&#xff0c;可以帮助搜索引擎了解你的网站&#xff1b; T&#xff1a;title 谷歌建议不超过70个字符 D&#xff1a;description 谷歌建议不超过150个字符 K&#xff1…

element-ui中el-radio-group组件绑定点击事件触发多次的解决办法

1、需求 电商首页需求&#xff0c;需要做个单选框&#xff0c;然后点击选中切换图标方向及更换价格升倒序&#xff0c;如下图&#xff1a; 从官网文档看&#xff0c;单选框支持change event&#xff0c;使用click加载按钮处不会触发选中 但是使用 click.native 事件不做处理…

ACID模型是什么

ACID模型是什么 ACID模型是数据库管理系统中保证事务处理安全性的一组特性。ACID是原子性&#xff08;Atomicity&#xff09;、一致性&#xff08;Consistency&#xff09;、隔离性&#xff08;Isolation&#xff09;和持久性&#xff08;Durability&#xff09;四个英文单词的…