C语言字符和字符串函数(2)

news2024/12/27 13:48:01

大家好,我今天继续来给大家分享C语言中的字符和字符串函数。
在这里插入图片描述

目录

**
1.字符分类函数
2.memcpy
3.memmove
4.memcmp**

1.字符分类函数

在这里插入图片描述

islower判断字母小写函数

int main()
{
	char ch = 'w';
	if (islower(ch))
	{
		printf("小写\n");
	}
	else
	{
		printf("非小写\n");
	}
	printf("%d ", islower(ch));

	return 0;
}

在这里插入图片描述

我们这个函数只要是小写的字母就会返回一个非0的数字,而不是小写的字母就会返回0。

isxdigit函数

这个是用来判断十六进制,十进制,还有大小写字母的函数,如果是的话就会返回非0值,不是的话就会返回0。

int main()
{
	int ret = isxdigit('q');
	printf("%d\n", ret);

	return 0;
}

在这里插入图片描述
toupper和tolower函数,小写转大写,大写转小写

int main()
{
	int ret = toupper('a');
	printf("%c\n", ret);//A
	ret = tolower(ret);
	printf("%c\n", ret);//'a'

	return 0;
}

在这里插入图片描述

这里再看到一个实例:

int main()
{
	char arr[] = "Test String.\n";
	char* p = arr;
	while (*p)
	{
		if (isupper(*p))
		{
			*p = tolower(*p);
		}
		p++;
	}
	printf("%s", arr);
	return 0;
}

在这里插入图片描述

这里我们用到了指针,指针里存放的是数组的地址,当我们判断*p是不是大写时,如果是就转小写,不是就进行下个字符的操作。学到了这里大家应该都明白了这些函数的使用原理。

2.memcpy函数

在这里插入图片描述

函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置。
这个函数在遇到 ‘\0’ 的时候并不会停下来。
如果source和destination有任何的重叠,复制的结果都是未定义的。

第一个参量是我们要复制的数据存储的空间,第二个参数是我们要复制的数据所在的空间,第三个参数是我们要复制的字节个数。

我们对这个函数进行模拟实现,看到代码

void* my_memcpy(void* dest, const void* src, size_t sz)
{
	assert(dest && src);
	while (sz--)
	{
		*(char*)dest = *(char*)src;
		dest = (char*)dest +1;
		src = (char*)src + 1;
	}
}

int main()
{
	int arr1[10] = { 0 };
	int arr2[] = { 1,2,3,4,5 };
	//把arr2中的前5个整数的数据,拷贝放在arr1中
	my_memcpy(arr1, arr2, 20);
	int i = 0;
	for(i=0;i<10;i++)
	printf("%d ", arr1[i]);
	return 0;
}

在这里插入图片描述

在这里我们要实现将数组arr2中的五个整数拷贝到数组arr1中,所以我们第一个参数指针储存的就是arr1的地址,第二个参数指针储存的就是arr2的地址,我们这里要拷贝五个整数,一个整数是四个字节,所以我们这里要拷贝五个整数就是20个字节。在这里我们要注意的是我们的指针是void型的,我们在拷贝时是一个一个字节进行拷贝,所以我们要对指针进行强制转换,char 型的指针是一个字节,所以我们给它解引用赋值给指针test就行,因为我们要拷贝数组arr2,所以数组arr2的数据是不会变化的,所以我们就可以对它用const进行修饰,我们要记得给它进行断言防止两个指针是空指针。

那我们如果要对一个数组本身进行拷贝呢,如图:
在这里插入图片描述

我们要将arr数组的前五个整数拷贝到数组arr的3到7位置,我们怎么做呢,那么我们传参的量是不是不一样呢?在这里我们可以很清楚的看到我们要拷贝的数组和我们拷贝到储存的数组中间是有一个重叠部分的,那我们这样会不会运行成功呢?

void* my_memcpy(void* dest, const void* src, size_t sz)
{
  void* ret = dest;
	assert(dest && src);
	while (sz--)
	{
		*(char*)dest = *(char*)src;
		dest = (char*)dest + 1;
		src = (char*)src + 1;
	}
  return ret;
 
}

int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	            //1 2 1 2 3 4 5 8 9 10
	my_memcpy(arr+2, arr, 20);

	return 0;
}

在这里插入图片描述

我们发现程序运行的和我们要实现的不一致,我们想要将3~7的位置拷贝成1,2,3,4,5,但是这里是1,2,1,2,1,这里是为什么,因为我们要拷贝的地方有重叠部分,我们把1拷贝到3的位置的时候已经改变了它在内存中的数据,也就是说这个位置不再是3,而是1,所以把3的位置拷贝到5的位置的时候就是1,后面的也是这样,那我们接下来可以通过下一个函数解决这个问题。

3.memmove函数

在这里插入图片描述

和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。
如果源空间和目标空间出现重叠,就得使用memmove函数处理。

我们看到这个函数的参数类型其实和第一个函数差不多,但是这个函数和第一个有个不同的特点,就是这个函数专门用来拷贝有重叠区域的数据。

int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	            //1 2 1 2 3 4 5 8 9 10
	//my_memcpy(arr+2, arr, 20);
	memmove(arr+2, arr, 20);
	//memcpy(arr + 2, arr, 20);
	

	return 0;
}

在这里插入图片描述
我们看到我们使用这个函数,直接就可以实现我们要实现的目的了。

int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	            //1 2 1 2 3 4 5 8 9 10
	//my_memcpy(arr+2, arr, 20);
	//memmove(arr+2, arr, 20);
	memcpy(arr + 2, arr, 20);
	

	return 0;
}

在这里插入图片描述

但是我们在这里发现memcpy函数在vs2022的环境中也可以对它进行处理,也能够完成拷贝的任务,我们规定的是memmove来实现有重叠部分的拷贝工作,但是我们的memcpy在vs2022的环境中也是满分。

那么我们想要模拟实现memmove函数该怎么实现呢?
在这里插入图片描述
在这里插入图片描述

我们要想将1 ~5拷贝到3 ~7的位置,中间又有重叠的部分,我们又该怎么样去做呢?这个时候我们就该考虑拷贝
的顺序了,到底是从前往后呢还是从后往前呢?如果我们要被拷贝的src在拷贝的dest前面,那么我们就采取从后往前拷贝的顺序,如果我们拷贝的dest在被拷贝的src前面,那么我们就采取从前往后的顺序拷贝。那么我们在这里就要找到一个分界线,前面用前往或者后往前的顺序,后面的则相反,这样的话我们就可以避开重叠部分实现拷贝。我们找到3为一个分界线从前往后,那么我们实现1和2的拷贝之后就是从前往后的顺序拷贝,我们之前拷贝了1到3的位置,所以在这个时候我们就得采取从后往前的顺序拷贝了。

【看到代码】:

void* my_memmove(void* dest, const void* src, size_t sz)
{
	assert(dest && src);
	void* ret = dest;
	if (dest < src)
	{
		//前->后
		int i = 0;
		for (i = 0; i < sz; i++)
		{
			*(char*)dest = *(char*)src;
			dest = (char*)dest + 1;
			src = (char*)src + 1;
		}
	}
	else
	{
		//后->前
		while (sz--)
		{
			*((char*)dest+sz) = *((char*)src + sz);
		}
	}
	return ret;
}

int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	my_memmove(arr+2, arr, 20);
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr[i]);
	}

	return 0;
}

在这里插入图片描述

我们看到代码运行的结果发现我们运行的成功了。

在这里我们在学习一个以字节为单位进行拷贝的函数。memset函数。


//memset 是设置内存的
//是以字节为单位设置内存的
int main()
{
	char arr[] = "hello world";
	memset(arr+6, 'x', 3);
	printf("%s\n", arr);

	//int arr[10] = { 0 };
	//memset(arr, 0, 40);

	return 0;
}

在这里插入图片描述
我们看到我们这里很简单的就将arr里的三个字符换成三个‘x’了。那如果是整型的数组我们是否可以完成拷贝呢?


//memset 是设置内存的
//是以字节为单位设置内存的
int main()
{
	/*char arr[] = "hello world";
	memset(arr+6, 'x', 3);
	printf("%s\n", arr);*/

	int arr[10] = { 0 };
	memset(arr, 0, 40);

	return 0;
}

在这里插入图片描述
如果是0的话还是可以拷贝的,如果是别的数的话不能执行了。

4.memcmp函数

在这里插入图片描述
在这里插入图片描述

我们这个函数也是一个字节一个字节比较大小,如果参数1大于我们的参数2就会返回一个大于0的值,等于就返回0,小于就返回小于0的值。

接下来我们看到实例:

int main()
{
	int arr1[] = { 1,2,3,4,5,6,7 };
	//01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00 05 00 00 00 06 00 00 00 07 00 00 00
	//
	int arr2[] = { 1,2,3,0x11223304 };
	//01 00 00 00 02 00 00 00 03 00 00 00 04 33 22 11
	int ret = memcmp(arr1, arr2, 13);
	printf("%d\n", ret);

	return 0;
}

在这里插入图片描述

我们这里有一个陷阱就是我们这里放的是一个十六进制的数,我们对arr1和arr2进行比较13个字节的大小可能很多小伙伴就会有疑惑了吧,但是请注意我们只比较13个字节的大小,而前13个字节的大小是相等的,所以我们这里返回的就是0。

学习的美好时光总是短暂的,我们今天就学到这里吧,下次再见,谢谢大家。

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

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

相关文章

【附源码】用Python写了一个下载网站所有内容的软件

目录 环境介绍:代码实战获取数据获取视频采集弹幕采集评论GUI部分 前言 嗨喽~大家好呀&#xff0c;这里是小曼呐 ❤ ~! 天我们分享一个用Python写下载视频弹幕评论的代码。 顺便把这些写成GUI&#xff0c;把这些功能放到一起让朋友用起来更方便~ 环境介绍: python 3.8pycha…

Request method ‘GET‘ not supported,不支持GET形式访问

org.springframework.web.HttpRequestMethodNotSupportedException: Request method ‘GET’ not supported 原因&#xff1a;异常提示的很明确&#xff0c;请求不支持GET方式访问&#xff0c;出现这种问题一般都是由于限制请求接口为POST&#xff0c;然后使用GET形式访问造成的…

Postman应用——Variable变量使用(Global、Environment和Collection)

文章目录 变量的使用同名变量优先级Postman内置变量 Global、Environment和Collection变量设置&#xff0c;点击查看。 变量的使用 语法&#xff1a; {{变量名}}使用{{}}包裹变量名&#xff0c;引用设置好的变量。 注意&#xff1a;Environment变量引用前需要先选择已有的环…

mysqld_exporter监控MySQL服务

一、MySQL授权 1、登录MySQL服务器对监控使用的账号授权 CREATE USER exporterlocalhost IDENTIFIED BY 123456 WITH MAX_USER_CONNECTIONS 3; GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO exporterlocalhost; flush privileges;2、上传mysqld_exporter安装包&#…

【2023研究生数学建模】E题完整解答过程

2023年中国研究生数学建模E题解答过程 目前已经完成E题全部代码和文档&#xff0c;包含代码&#xff0c;结果&#xff0c;技术文档&#xff0c;以及详细的解题思路&#xff0c;分享一部分给大家&#xff0c;需要完整版的直接私信我哦~

攻防世界做题

xff_referer 进来之后显示ip地址必须为123.123.123.123 抓包看一下 要求ip是123.123.123.123 就可以用xff伪造即X-Forwarded-For: 123.123.123.123 得到显示&#xff1a; 说必须来自google&#xff0c;伪造referer Referer: https://www.google.com 我的要在右边的 inspec…

报错处理:解决Linux上Nginx启动报错:Worker Processes Sleeping

大家好&#xff0c;今天我来分享一个我在运维过程中遇到的问题&#xff0c;关于Linux上Nginx启动时出现的“Worker Processes Sleeping”报错&#xff0c;以及如何解决这个问题的。 首先&#xff0c;让我们来看看这个报错信息。当你在启动Nginx时&#xff0c;如果你看到类似以下…

如何用ArkUI实现一个加入购物车效果?

关键词&#xff1a;ArkUI的动效能力&#xff0c;动效开发&#xff0c;ArkUI动画 我们在购买商品时&#xff0c;往往习惯将商品先加入购物车&#xff0c;然后在购物车里确认后再下订单&#xff0c;这是一个典型的访问者模式。对于这个高频场景&#xff0c;增添一些动效可以增加a…

基于springboot+vue的老年一站式服务平台

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

【kafka】可视化工具KAFKA EAGLE安装分享

目录 准备&#xff1a; 开始&#xff1a; 1.解压 2.环境变量配置 3.生效环境变量配置文件 3.修改配置文件 1.修改zookeeper集群信息 2.修改mysql配置信息 4.启动 5.异常排查 6.页面 创作不易&#xff0c;你的动力是我创作的动力&#xff0c;如果有帮助请关注我&…

Java面向对象(1)

static静态变量 public class Student {static String name;private double score;public Student(){};public Student(double score) {this.score score;}public double getScore() {return score;}public void setScore(double score) {this.score score;} }public class t…

Flink状态

8.1 Flink中的状态 8.1.1 概述 状态的分类 1&#xff09;托管状态&#xff08;Managed State&#xff09;和原始状态&#xff08;Raw State&#xff09; Flink的状态有两种&#xff1a;托管状态&#xff08;Managed State&#xff09;和原始状态&#xff08;Raw State&#…

【自学记录】深度学习入门——基于Python的理论与实现(第3章 神经网络)

3.4.3 3层神经网络Python实现 实现的是这个网络 **init_network()**函数会进行权重和偏置的初始化&#xff0c;并将它们保存在字典变量network中。这个字典变量network中保存了每一层所需的参数(权重和偏置)。 **forward()**函数中则封装了将输入信号转换为输出信号的处理过程…

CSS 选择器的几种方法

CSS 选择器的几种方法 业余选手爱记笔记示例代码用否定伪类伪元素用代数式法同胞选择符 ~相邻同胞选择符 业余选手爱记笔记 CSS权威指南&#xff08;第四版&#xff09;是一本好书&#xff0c;看了一遍第二章的选择符有些受益&#xff0c;记录一点读后感和练习。我已将该书电…

ShipMaker船舶协同设计软件介绍

作者简介&#xff1a; 有将近20年的软件开发经验&#xff0c;包括15年CAD&#xff08;7年船舶和8年建筑CAD软件&#xff09;软件开发和5年高性能服务器开发。精通CAD建模平台底层架构和服务器开发技术&#xff0c;包括对象存储管理及拷贝、图形对象渲染、文件保存及升级、事务…

C语言自定义类型详解(2)位断、枚举、联合知识汇总

本篇概要 本篇主要讲述C语言位断、枚举。联合的相关知识&#xff0c;包括哥哥自定义类型的基本声明&#xff0c;使用、优点。计算等相关知识。 文章目录 本篇概要1.位断1.1什么是位断&#xff1f;1.2 位段的内存分配1.3 位段的跨平台问题1.3 位段的应用 2.枚举2.1 枚举类型的声…

堆的基本操作和PriorityQueue接口

目录 堆的插入 堆的删除 PriorityQueue接口 PriorityQueue的注意事项: PriorityQueue常用接口介绍 1. 优先级队列的介绍 2. 扩容 3. 插入/删除/获取优先级最高的元素 Java对象的比较 1.基本类型的比较 2.对象比较的问题 3.对象比较的方法 Top- k问题 堆的插入 堆的插入…

asp.net core openxml读取word内容

安装包 OpenXMLSDK-MOT System.IO.Packaging 编写代码测试 using DocumentFormat.OpenXml.Packaging; using DocumentFormat.OpenXml.Wordprocessing; using System; using System.Linq; using System.Text;namespace WordReader {internal class Program{static void Main(…

【Python从入门到进阶】37、selenium关于phantomjs的基本使用

接上篇《36、Selenium 动作交互》 上一篇我们介绍了selenium操作网页的动作内容。本篇我们来学习有关phantomjs的相关知识。 一、selenium的缺点 在介绍PhantomJS之前&#xff0c;让我们先讨论一下直接使用Selenium的一些缺点。 1、显示浏览器窗口&#xff1a;Selenium通常需…

管理类联考——数学——汇总篇——知识点突破——几何——平面几何——记忆

文章目录 整体记忆宫殿角度/分类/串联线——从小到大角度/分类/串联线2——求长度&#xff0c;面积&#xff0c;角度 局部数字编码口诀法五大模型/共角定理、风筝模型、蝴蝶模型 转化图像法特点法公式推导法&#xff1a;公式推导掌握数学公式射影定理共角定理燕尾定理蝴蝶定理/…