【内存操作函数】字符串函数不敢干的事,我干!

news2024/10/7 4:22:51

💓博主CSDN主页:杭电码农-NEO💓

⏩专栏分类:C语言学习分享⏪

🚚代码仓库:NEO的学习日记🚚

🌹关注我🫵带你学习更多C语言知识
  🔝🔝


在这里插入图片描述


内存操作函数

  • 1. 前言🚩
  • 2. memcpy介绍🚩
    • 2.1 memcpy的缺点🏁
  • 3. memmove函数介绍🚩
    • 3.1 memmove的缺陷🏁
  • 4. memset函数介绍🚩
  • 5. memcmp函数介绍🚩
  • 6. memchr函数介绍🚩
  • 7. 总结及拓展🚩


1. 前言🚩

我最近在刷题的时候全然不知的写出了一个bug代码,它大概意思是这样的:

int a[]={1,2,3};
int b[]={0,0,0}strcpy(a,b);

我想将b数组拷贝到a数组去,我第一时间想到了strcpy函数。

  • 但是显然strcpy是操作字符串的
  • 那么我们有没有什么办法能够像strcpy函数一样操作整型呢?

天空一声巨响,我们的内存操作函数闪亮登场!今天的主角有三个:

  1. 男主小帅:memcpy函数 😎
  2. 女主小美:memmove函数 😎
  3. 猛男丧彪:memset函数 😎

还附送两个配角:

  1. 友情出演: memcmp函数
  2. 群众演员: memchr函数

2. memcpy介绍🚩

memcpy的函数原型:
在这里插入图片描述
功能:从source的起始位置复制num个字节到destination的内存起始位置

用法示例:

#include<stdio.h>
#include<string.h>
int main()
{
	int a[5] = { 1,2,3,4,5 };
	int b[3] = { 33,22,11 };
	memcpy(a, b, sizeof(int) * 3);//将数组b往后12个字节(3个整型)的内容拷贝到数组a
	for (int i = 0; i < 5; i++)
	{
		printf("%d ", a[i]);
	}
	return 0;
}

值得注意的是:memcpy函数返回void* 类型指针,并且接受变量的类型也是void *,如果你想了解void * 这个变量,可以跳转 C语言void*详解


2.1 memcpy的缺点🏁

memcpy函数中的两个参数在内存中的位置是不能发生重叠的.

什么意思?举个例子:
在这里插入图片描述

既然memcpy函数有缺陷,是时候让我们的女主:memmove函数出来解决问题了!


3. memmove函数介绍🚩

memmove的函数原型:
在这里插入图片描述
功能:从source的起始位置复制num个字节到destination的内存起始位置

memmove和memcpy函数的功能是一样的,只不过memmove函数的source和destination指向的空间可以重叠

用法示例:

#include<stdio.h>
#include<string.h>
int main()
{
	int a[9] = { 1,2,3,4,5,6,7,8,9 };
	memmove(a, a + 5, 16);

	for (int i = 0; i < 9; i++)
	{
		printf("%d ", a[i]);
	}
	return 0;
}

这个结果符合我们的预期:
(覆盖了前面的1234后,后面的56789照常打印)

在这里插入图片描述


3.1 memmove的缺陷🏁

  • memmove函数无法使用某些机器所提供的特殊字节-字符串处理指令来实现
    👍 👍 👍
  • 导致的结果:memmove会比memcpy的效率低一些
    👍 👍 👍
  • 如果源和目标参数真的可能存在重叠,就应该使用memmove!

4. memset函数介绍🚩

memset的函数原型:
在这里插入图片描述

功能:把从ptr开始的num个字节的值都设置为value

用法示例:

#include<stdio.h>
#include<string.h>
int main()
{
	char a[6] = { 'a','b','c','d','e','f'};
	memset(a, '-', 3);

	for (int i = 0; i < 6; i++)
	{
		printf("%c ", a[i]);
	}
	return 0;
}

结果和我们预期的一样:
(将前三个字节的内容改成 ’ - ’ )

在这里插入图片描述

注意,这里内存操作函数中参数num的单位都是字节,如果你想要修改一个整型数组的前n个值,别忘了用n乘以整型的长度!


5. memcmp函数介绍🚩

memcmp的函数原型:
在这里插入图片描述

功能:memcmp对两段内存ptr1和ptr2的内容进行比较,共比较num个字节

用法示例:

#include <stdio.h>
#include <string.h>
int main ()
{
  char buffer1[] = "DWgaOtP12df0";
  char buffer2[] = "DWGAOTP12DF0";
  int n = memcmp( buffer1, buffer2, sizeof(char)*5);
  return 0;
}

memcmp的返回类型和strcmp一样:

  • 负数代表ptr1小于ptr2.👀
  • 正数代表ptr1大于ptr2.👀
  • 0代表它们两个相同👀

值得注意的是:这些值是按照无符号字符逐字节比较,所以它用于比较不是单字节数据如整数,浮点数时可能给出不可预料的结果.


6. memchr函数介绍🚩

memchr的函数原型:
在这里插入图片描述

功能:

  • 从ptr开始,查找value第一次出现的位置
  • 共查找num个字节.
  • 如果找到,返回一个指向该位置的指针
  • 如果没找到,返回NULL.

用法示例:

#include<stdio.h>
#include<string.h>
int main()
{
	char a[6] = { 'a','b','c','d','e','f'};
	char* p = memchr(a, 'd', sizeof(char) * 6);//在数组a中查找字符d第一次出现的位置
	for (int i = 0; i < 3; i++)//这里返回一个指针指向字符d,并将这个指针赋值给p
	{
		printf("%c ", p[i]);
	}
	return 0;
}

结果也符合我们的预期:

在这里插入图片描述


7. 总结及拓展🚩

总的来说这一板块还是没有难度的,所有的内存操作函数需要包含的头文件是:string.h.关于内存操作函数我们就完结撒花啦!

函数原型出处:C\C++字典:cplusplus

下面我给大家拓展一些字符操作函数:
(在做题时可以节省时间)

比如:

  • 判断字符是否为0~9的数字
  • 判断字符是不是字母
  • 判断是否为大写字母(小写)
  • 等等…
函数满足下面条件就返回真
isspace空白字符:空格’ ‘,换页’\f’,换行’\n’,回车’\r’,制表符’\t’
isdigit十进制数字: 0 ~ 9
islower小写字母: a ~ z
isupper大写字母: A ~ Z
isalpha字母 : a ~ z 或 A ~ Z
isalnum字母或者数字: a ~ z,A ~ Z,0 ~ 9
ispunct标点符号,任何不属于数字或字母的图形

两个转换函数:

  • 大写字母转小写字母: tolower
  • 小写字母转大写字母: toupper

如:

char x = tolower('A');//变量x存储的是字符 'a'

最后,看完这一节的内容后
下次遇见字符串拷贝
你会用什么函数来完成任务?
来参与一下投票吧!


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

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

相关文章

操作系统复习2.4.0-死锁详解

什么是死锁 各进程互相竞争对手里的资源&#xff0c;导致各进程都阻塞&#xff0c;都无法向前推进 死锁、饥饿、死循环的区别 死锁&#xff1a;各进程互相持有对方想要的资源且不释放&#xff0c;导致各进程阻塞&#xff0c;无法向前推进 饥饿&#xff1a;由于长期得不到想要…

Chatbot + 知识库(Knowledge Base)

从 GPT-3 和 ChatGPT 等大型语言模型 (LLM) 的最新进展中可以看出&#xff0c;在技术行业引起了很大的关注。这些模型对内容生成非常强大&#xff0c;但它们也有一些缺点&#xff0c;例如偏差1 和幻象2。LLM在聊天机器人开发方面特别有用。 基于意图的聊天机器人​ 传统聊天机…

Redis中的压缩列表(ZipList)

前言 压缩列表的最大特点&#xff0c;就是它是一种内存紧凑型的数据结构&#xff0c;占用一块连续的内存空间&#xff0c;而且还会根据数据类型的不同&#xff0c;选择不同的编码方式来节省内存。 压缩列表的缺点也很明显 它查询节点只能一个一个查&#xff0c;所以时间复杂…

用springboot创建helloworld项目

目录 一、什么是springboot 二、使用idea构建springboot &#xff08;1&#xff09;下载idea &#xff08;2&#xff09;在idea配置maven &#xff08;3&#xff09;利用springboot构建1个helloworld的web项目​编辑​编辑 ​编辑 &#xff08;4&#xff09;启动springboot…

软考A计划-电子商务设计师-电子商务系统的测试

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分享&am…

Zinx框架学习 - 消息队列及多任务

Zinx - V0.8 消息队列及多任务 之前zinxV0.7我们已经实现了读写分离&#xff0c;对应每个client&#xff0c;我们有3个go程&#xff0c;分别是reader、writer、DoMsgHandle假设服务器有10W个client请求&#xff0c;那么server就会有10W个reader的go、10W个writer的go程&#x…

python编程——环境搭建

作者&#xff1a;Insist-- 个人主页&#xff1a;insist--个人主页 本文专栏&#xff1a;python专栏 专栏介绍&#xff1a;本专栏为免费专栏&#xff0c;并且会持续更新python基础知识&#xff0c;欢迎各位订阅关注。 目录 一 、安装python 1、进入官网下载python 2、打开安装…

【AI4DB】商用数据库-使用AI4DB技术并商用的数据库总结

目录 1.Amazon Redshift参考链接&#xff1a; 2.阿里云-DAS-Database Autonomy Service参考链接&#xff1a; 3.Oracle Autonomous Database参考链接&#xff1a; 4.阿里云-MaxCompute&#xff08;原ODPS&#xff09;参考文档&#xff1a; 5.腾讯云——DBbrain参考链接&#xf…

python 算符优先分析法的设计实现 编译原理

本文内容&#xff1a; 1、给出文法如下: G[E] E->T|ET; T->F|T*F; F->i|(E); 可以构造算符优先表如下: *()i><<><*>><><(<<<<)>>>i>>> 2、计算机中表示上述优先关系&#xff0c;优先关系的机内存放…

飞桨花滑骨骼点动作识别比赛——从 baseline 调优讲解

赛题介绍背景数据集 思路讲解backbone 模型文件结构 -- PaddleVideo 框架configs 文件夹paddlevideo 文件夹 模型介绍1. ST-GCN -- Baseline 模型整体结构GCN部分TCN部分 2. 2s-AGCN自适应图卷积双流网络 3. CTR-GCNCTR-GC 赛题介绍 背景 2021 CCF BDCI 基于飞桨实现花样滑冰…

初识JavaScript---(1)

初识JavaScript———&#xff08;1&#xff09;&#xff01;&#xff01;&#xff01; 一、初识JavaScript 1.什么是JavaScript&#xff1f; JavaScript是运行在浏览器上的脚本语言&#xff0c;简称JS。JavaScript程序不需要我们程序员手动编译&#xff0c;编写完源代码之后…

shell编程-02-变量作用域

作用域 局部变量&#xff1a;变量只能在函数内部使用 全局变量&#xff1a;变量可以在当前 Shell 进程中使用 环境变量&#xff1a;变量还可以在子进程中使用 局部变量 函数中定义的变量默认是全局变量&#xff0c;在定义时加上local命令&#xff0c;此时该变量就成了局部变…

Spring系列-10 事务机制

背景&#xff1a; 在 事务-1 事务隔离级别和Spring事务传播机制 中对事务的特性、隔离级别、Spring事务的传播机制结合案例进行了分析&#xff1b;在 事务-2 Spring与Mybatis事务实现原理 中对JDBC、Mybatis、Spring整合Mybatis实现事务的原理结合框架源码进行了介绍&#xff…

如何免费使用GPT-4模型

一、引言 OpenAI 最近发布了ChatGPT最新的 GPT-4 模型&#xff0c;这是 OpenAI 迄今为止发布的最强大的语言模型系统。它不仅有视觉能力&#xff0c;而且是多模态的&#xff0c;可以解释文本和生成图像。此外&#xff0c;它在推理测试中表现良好&#xff0c;可以支持大约26种不…

Redis的ZipList和QuickList和SkipList和RedisObject

ZipList:压缩列表&#xff0c;为了节省内存而设计的一种数据结构 ZipList是一种特殊的双端链表&#xff0c;是由一系列的特殊编码的连续内存块组成&#xff0c;不需要通过指针来进行寻址来找到各个节点&#xff0c;可以在任意一端进行压入或者是弹出操作&#xff0c;并且该操作…

RocketMQ的学习历程(5)----broker内部设计

文章目录 概要整体架构流程技术名词解释CommitLog和ConsumeQueue页缓存和内存映射刷盘机制 小结 概要 在首个学习历程中&#xff0c;我们已经了解了&#xff0c;RokctMQ简单的工作流程。 如果想要更深的理解RokcetMQ消息处理的流程&#xff0c;broker内部流程的理解是必要的&…

【挑战全站最全】Linux系统的安装与配置教程——以CentOS为例

&#x1f680;作者&#xff1a;那个叫马尔的大夫&#x1f680; ⭐专栏&#xff1a;操作系统⭐ &#x1f33c;内容&#xff1a;主要分享一些关于Linux操作系统的知识 &#x1f967;不忘初心&#xff0c;砥砺前行~ 目录 一、用到的软件环境——虚拟机软件&#xff08;必需&#…

调用函数不仅仅只是传递正确的参数类型

这里有一个新手犯下的一个典型错误。 假设&#xff0c;我们想调用这个函数&#xff0c;GetBinaryType。 void sample() { if (GetBinaryType(TEXT(“explorer.exe”), ????)) { … } } 请问&#xff0c;这里的问号处应该传递什么类型的参数&#xff1f;你可能会说&#x…

python、pyqt5实现人脸检测、性别和年龄预测

摘要&#xff1a;这篇博文介绍基于opencv&#xff1a;DNN模块自带的残差网络的人脸、性别、年龄识别系统&#xff0c;系统程序由OpenCv, PyQt5的库实现。如图系统可通过摄像头获取实时画面并识别其中的人脸表情&#xff0c;也可以通过读取图片识别&#xff0c;本文提供完整的程…

设计模式入门:策略模式

现有一套模拟鸭子游戏&#xff0c;可以一边游泳&#xff0c;一边呱呱叫。 每种鸭子都会呱呱叫和游泳&#xff0c;只是外观不同。因此&#xff0c;quack和swim放在父类中&#xff0c;display放在子类中实现。 增加新的功能&#xff1a;鸭子飞翔。 1 我们可能想到直接在父类中增…