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: 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容器、灰度发布、热更新、离线包、网关服务、…

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;四个英文单词的…

开源博客项目Blog .NET Core源码学习(15:App.Hosting项目结构分析-3)

本文学习并分析App.Hosting项目中前台页面的关于本站页面和点点滴滴页面。 关于本站页面 关于本站页面相对而言布局简单&#xff0c;与后台控制器类的交互也不算复杂。整个页面主要使用了layui中的面包屑导航、选项卡、模版、流加载等样式或模块。   面包屑导航。使用layui…

初探vercel托管项目

文章目录 第一步、注册与登录第二步、本地部署 在个人网站部署的助手vercel&#xff0c;支持 Github部署&#xff0c;只需简单操作&#xff0c;即可发布&#xff0c;方便快捷&#xff01; 第一步、注册与登录 进入vercel【官网】&#xff0c;在右上角 login on&#xff0c;可登…

WXML模板语法-条件与列表渲染

wx:if 在小程序中&#xff0c;使用wx:if"{{condition}}"来判断是否需要渲染该代码 也可以用wx:elif和wx:else来添加else判断 <!--pages/ifIndex/ifindex.wxml--> <view wx:if"{{type 1}}">男</view> <view wx:elif"{{type …

【Linux】磁盘与文件系统管理

目录 一、 磁盘结构 1. 数据结构 2. 物理结构 3. 硬盘的接口类型 二、 如何使用Linux中的磁盘 三、 文件系统 四、 磁盘分区 1. MBR分区 2. 分区的优缺点 3. 磁盘及分区的管理工具 五、格式化与挂载 1. 格式化 2. 挂载 六、实例演示 1. 演示分区格式化挂载 2. …

24年大一4月14日训练(东北林业大学)

前言&#xff1a; 今晚的5道题。 正文&#xff1a; Problem:A宋哥猜拳(2)&#xff1a; #include<bits/stdc.h> using namespace std; int main(){int t;cin>>t;while(t--){string x;cin>>x;int a0,b0,c0,lx.length();// cout<<l;for(int i0;i<l;i…