脆皮之“字符函数与字符串函数”宝典

hello,大家好呀,感觉我之前有偷偷摸鱼了,今天又开始学习啦。加油!!!
在这里插入图片描述

文章目录

  • 1. 字符分类函数
  • 2. 字符转换函数
  • 3. strlen的使用和模拟实现
    • 3.1 strlen 的使用
    • 3.1 strlen 的模拟
      • 1.计算器方法
      • 2.指针-指针的方法
      • 3.递归的方法
  • 4. strcpy的使用和模拟实现
  • 5. strcat的使用和模拟实现
  • 6. strcmp的使用和模拟实现
  • 7. strncpy函数的使用
  • 8. strncat函数的使用
  • 9. strncmp函数的使用
  • 10. strstr的使用和模拟实现
  • 11. strtok函数的使用
  • 12. strerror函数的使用

1. 字符分类函数

C语言中有一系列的函数是专门做字符分类的,且这些函数在使用时都需要包含头文件:ctype.h

在这里插入图片描述

这些函数的使用大同小异,我举其中的一个例子:

从上图可以看出,函数islower是用来判断是否为小写字母,我们可以在cplusplus搜索islower函数,它给出的是:如果是小写字母,则返回非0值;如果不是小写字母,则返回0.

int main()
{
	int c = islower('A');
	int q = islower('a');
	printf("c=%d\n", c);
	printf("q=%d\n", q);
	return 0;
	//打印结果是:c=0;q=2
}

练习写一个代码:将字符串中的小写字母转大写,其他字符不变。(在学习字符转换函数之后有另外一种方式,大家可以尝试一下)

#include<stdio.h>
#include<ctype.h>
int main()
{
	char arr[] = "I am very sad." ;
	int i = 0;
	while (arr[i] != '\0')
	{
		if (islower(arr[i]))
		{
			arr[i] = arr[i] - 32;
		}
		i++;
	}
	//再将字符串输出,看是否变成大写
	printf("%s\n", arr);
	return 0;
}

2. 字符转换函数

C语言提供了2个字符转换函数:
int tolower ( int c ); ------- 转成小写--------- //将参数传进去的大写字母转小写
int toupper ( int c );------- 转成大写----------//将参数传进去的小写字母转大写
int c的意思是传入一个字符(字符的本质就是ascll码值),int tolower的意思是返回值为整数

int main()
{
	char ch = tolower('A');
	printf("%c\n", ch);

	char hh = toupper('a');
	printf("%c\n", hh);
}

之前小写转大写可以将if语句里面改掉

int main()
{
	char arr[] = "I am very sad." ;
	int i = 0;
	while (arr[i] != '\0')
	{
		if (islower(arr[i]))
		{
			arr[i] = toupper(arr[i]);
		}
		i++;
	}
	//再将字符串输出,看是否变成大写
	printf("%s\n", arr);
	return 0;
}

3. strlen的使用和模拟实现

3.1 strlen 的使用

1.使用strlen需要包含头文件:string.h
2.字符串以’\0’ 作为结束标志。

  • 比如:“abc” 其实就是‘a’ ‘b’ ‘c’ ‘\0’,一共4个字符。但是strlen只统计’\0‘之前的字符个数。(不包含’\0’)
  • 如果字符数组中是char arr[]={‘a’,‘b’,‘c’};的话,则是没有\0的,什么时候遇到\0不确定。
int main()
{
	char arr[] = "aaattt";
	size_t len = strlen(arr);
	printf("%d\n", len);//6
	char qqq[]={'a','b'};
	size_t lee = strlen(qqq);
	printf("%d\n",lee);//随机值
	return 0;
}

3.strlen的返回值是size_t(即无符号整数)

int main()
{
	char ch1[] = "abc";
	char ch2[] = "abcdef";
	if (strlen(ch1) - strlen(ch2) < 0)
		//3         -      6
	{
		printf("ch1<ch2");
	}
	else
	{
		printf("ch1>ch2");
	}
}
//最终的结果是ch1>ch2

3-6=-3,小于0,为什么输出是大于?

在这里说明,strlen的返回值是size_t,无符号整数-无符号整数=还是无符号整数,所以strlen(ch1) - strlen(ch1)的结果其实>0,所以输出>。

如果非要比较,可以将strlen的返回值强制类型转换为int,(int)strlen(ch1)-(int)strlen(ch2)。或者直接比较: if (strlen(ch1) < strlen(ch2) )

3.1 strlen 的模拟

1.计算器方法

(1.) 这是最初的版本,之后优化。

size_t my_strlen(char* str)
{
	int count = 0;
	while (*str != '\0')
	{
		count++;//个数+1
		str++;//下一个元素的地址
	}
	return count;
}
int main()
{
	char ch[] = "aaaqqq";
	size_t len = my_strlen(ch);//传数组传的是数组名(这里代表的是数组首元素地址)
	printf("%d\n", len);
}

(2.)1.万一指针是空指针呢?我们先用断言判断一下
2.我们只是想遍历一遍数组的每个元素,找到\0,并不希望有人将元素修改了,所以用const修饰*ch

#include<assert.h>
size_t my_strlen(const char* str)//用指针变量来接收地址
{
	
	int count = 0;
	assert(str != NULL);
	while (*str != '\0')
	{
		count++;//个数+1
		str++;//下一个元素的地址
	}
	return count;
}
int main()
{
	char ch[] = "aaaqqq";
	size_t len = my_strlen(ch);//传数组传的是数组名(这里代表的是数组首元素地址)
	printf("%d\n", len);
}

2.指针-指针的方法

用起始地址-\0的地址=就是中间的元素个数

这几种方法int main函数里的内容都一样,之后就不再展示,只展示my_strlen函数里的内容

size_t my_strlen(const char* str)
{
	int count = 0;
	assert(str != '\0');
	int start = str;//这里str还是起始元素的地址
	while (*str != '\0')
	{
		//通过这个循环,使得str里面放的是\0的地址
		str++;
	}
	int end = str;
	return end - start;
}

3.递归的方法

在这里插入图片描述

size_t my_strlen(const char* str)
{
	if (*str != '\0')
		return 1 + my_strlen(str + 1);
	else
		return 0;
}

4. strcpy的使用和模拟实现

5. strcat的使用和模拟实现

6. strcmp的使用和模拟实现

7. strncpy函数的使用

8. strncat函数的使用

9. strncmp函数的使用

10. strstr的使用和模拟实现

11. strtok函数的使用

12. strerror函数的使用

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

探索LangGraph:如何创建一个既智能又可控的航空客服AI

这种设计既保持了用户控制权&#xff0c;又确保了对话流程的顺畅。但随着工具数量的增加&#xff0c;单一的图结构可能会变得过于复杂。我们将在下一节中解决这个问题。 第三部分的图将类似于下面的示意图&#xff1a; 状态定义 首先&#xff0c;定义图的状态。我们的状态和L…

Blazor 下支持 Azure AD 的多套登录方案

比如上图配置了两套不同的登录方案&#xff0c;各有自己的 TenantId 和 ClientId &#xff0c;要同时支持他们的登录&#xff08;其实在同一套 TenantId 和 ClientId 里面配置多个登录账户不就好了&#xff0c;但是......那套登录的管理是在客户自己的Azure AD账户管理下的&…

Python数据可视化(七)

绘制 3D 图形 到目前为止&#xff0c;我们一直在讨论有关 2D 图形的绘制方法和绘制技术。3D 图形也是数据可视化的 一个很重要的应用方面&#xff0c;我们接下来就重点讲解有关 3D 图形的实现方法。绘制 3D 图形通常需要导 入 mpl_toolkits 包中的 mplot3d 包的相关模块&#x…

【openlayers系统学习】3.6-3.7添加可视化选择器,手动选择可视化的图像源

六、添加可视化选择器&#xff08;选择可视化的图像类型&#xff09; 在前面的示例中&#xff0c;我们已经看到了同一Sentinel-2图像的真彩色合成、假彩色合成和NDVI渲染。如果能让用户从这些可视化中选择一个或更多&#xff0c;而不必每次都更改我们的代码&#xff0c;那就太…

2024年顶级算法-黑翅鸢优化算法(BKA)-详细原理(附matlab代码)

黑翅鸢是一种上半身蓝灰色&#xff0c;下半身白色的小型鸟类。它们的显著特征包括迁徙和捕食行为。它们以小型哺乳动物、爬行动物、鸟类和昆虫为食&#xff0c;具有很强的悬停能力&#xff0c;能够取得非凡的狩猎成功。受其狩猎技能和迁徙习惯的启发&#xff0c;该算法作者建立…

C++利用TinyXML读取XML文件

TinyXML是什么&#xff1f; TinyXML是一个轻量级的C XML解析器&#xff0c;它提供了一种简单的方法来解析和操作XML文档。TinyXML被设计为易于使用和集成到C项目中&#xff0c;并且非常适合处理小型XML文件。 以下是TinyXML的一些主要特点和优点&#xff1a; 轻量级: T…

0基础从前端到Web3 —— Mine Clearance Frontend(二)

在一的基础上继续往下&#xff0c;本篇主要是链上调用部分&#xff0c;让整个项目可以进行最基本的扫雷游戏。 S u i M o v e \mathit {Sui\ Move} Sui Move 链上部署的自主实现的简单扫雷游戏可以点击查看&#xff0c;只不过这里将区域大小扩大为了 10 20 \text {10}\ \tim…

Plesk中如何移除之前添加的域名

我这边想要移除我之前绑定到主机的域名&#xff0c;但是不知道如何在主机上面进行移除&#xff0c;由于我使用的Hostease的Windows虚拟主机产品默认带普通用户权限的Plesk面板&#xff0c;但是不知道如何在Plesk上操作移除域名&#xff0c;因为也是对于Hostease主机产品不是很了…

python给图片加上图片水印

python给图片加上图片水印 作用效果代码 作用 给图片加上图片水印图片水印的透明度&#xff0c;位置可自定义 效果 原始图片&#xff1a; 水印图片&#xff1a; 添加水印后的图片&#xff1a; 代码 from PIL import Image, ImageDraw, ImageFontdef add_watermark(in…

联盟 | 歌者 AIPPT X HelpLook携手,开启企业高效办公新时代

面对日益增长的工作负荷和追求效率优化的压力&#xff0c;企业知识的积累与传播显得愈发重要。如何系统化地沉淀员工与企业的知识精华&#xff1f;如何快速分享内外部知识&#xff1f;更重要的是&#xff0c;如何在获取这些知识后&#xff0c;迅速将其转化为精美的PPT&#xff…

抖店一件代发,从0到1操作全流程

我是王路飞。 先说明一点&#xff0c;新手不需要纠结抖店一件代发&#xff08;即无货源模式&#xff09;还能不能做的问题。 无货源只是前期帮助新手阶段的你进入到这个市场里来的一种方式&#xff0c;不是你长期做店的思路。 入门之后&#xff0c;基本就转型为有货源去玩了…

漫画|基于SprinBoot+vue的漫画网站(源码+数据库+文档)

漫画网站 目录 基于SprinBootvue的漫画网站 一、前言 二、系统设计 三、系统功能设计 1系统功能模块 2管理员功能模块 3用户功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a;✌️大…

node 版本对应的 node-sass 版本号

当我们在项目中使用 node-sass 时&#xff0c;电脑的 node版本号一定要与 node-sass 版本号对应&#xff0c;不对应时下载就会报错 ❌问题&#xff1f;node-sass: Command failed. ✅解决方案&#xff0c;可能是node 跟 node-sass版本不一致 1、查询node版本 node -v &#…

RabbitMQ - SimpleMessageListenerContainer的实现逻辑

RabbitMQ - SimpleMessageListenerContainer的实现逻辑 Queue&#xff08;队列&#xff09;&#xff1a;在 RabbitMQ 中用于存储消息的数据结构。生产者将消息发送到队列中&#xff0c;而消费者从队列中接收消息。 Connection&#xff08;连接&#xff09;&#xff1a;连接是应…

Unity 实现心电图波形播放(需波形图图片)

实现 在Hierarchy 面板从2D Object 中新建一个Sprite&#xff0c;将波形图图片的赋给Sprite。 修改Sprite 的Sprite Renderer 组件中Draw Mode 为Tiled, 修改Sprite Renderer 的Size 即可实现波形图播放。 在Hierarchy 面板从2D Object 中新建一个Sprite Mask 并赋以遮罩图片…

【学习笔记】Windows GDI绘图(六)图形路径GraphicsPath详解(中)

上一篇【学习笔记】Windows GDI绘图(五)图形路径GraphicsPath详解(上)介绍了GraphicsPath类的构造函数、属性和方法AddArc添加椭圆弧、AddBezier添加贝赛尔曲线、AddClosedCurve添加封闭基数样条曲线、AddCurve添加开放基数样条曲线、基数样条如何转Bezier、AddEllipse添加椭圆…

2024年了, 你还不会使用node.js做压力测试?

前些天刷抖音&#xff0c;看到网传的Java继父&#xff0c;求人攻击压测他的网站&#xff0c;这不得摩拳擦掌。 所以今天来聊聊如何对自己的项目、接口进行压力测试。 压力测试的目的 首先, 绝对不是为了压测、攻击别人的网站为乐。 1、探索线上系统流量承载的极限&#xff…

python批发模块的调试之旅:从新手到专家的蜕变

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、调试技巧的重要性 二、批发模块调试的实战演练 1. 设置断点 2. 逐行执行代码 3. 观察…

安全风险 - 检测Android设备系统是否已Root

在很多app中都禁止 root 后的手机使用相关app功能&#xff0c;这种场景在金融app、银行app更为常见一些&#xff1b;当然针对 root 后的手机&#xff0c;我们也可以做出风险提示&#xff0c;告知用户当前设备已 root &#xff0c;谨防风险&#xff01; 最近在安全检测中提出了一…