【C语言】内存函数详细讲解

文章目录

  • 前言
  • strerror的声明和使用
  • 字符串分类函数
  • 字符转换函数
  • 内存拷贝函数(memcpy)
    • memcpy的声明和使用
    • memcpy函数的模拟实现
  • 内存拷贝函数(memmove)
    • memmove的声明和使用
    • memmove模拟实现
  • 内存比较函数(memcmp)
    • memcmp的声明和使用
  • 内存设置函数(memset)
    • memset的使用
  • 最后

前言

前面我们学习了字符串函数,但字符串函数只能对字符串进行操作,但在C语言中有很多的数据类型,所以本章讲解一些内存函数,这些函数可以对任何数据类型进行拷贝、追加、比较。


strerror的声明和使用

char * strerror ( int errnum );

在这里插入图片描述

  • 获取指向错误消息字符串的指针。
  • 解释错误码(errnum)所对应的错误信息。
  • 必须包含头文件errno.h
  • strerror 生成的错误字符串可能特定于每个系统和库实现。

在vs2022编译编译器下的运行结果
在这里插入图片描述

字符串分类函数

函数如果他的参数符合下列条件就返回真
iscntrl任何控制字符
isspace空白字符:空格‘ ’,换页‘\f’,换行’\n’,回车‘\r’,制表符’\t’或者垂直制表符’\v’
isdigit十进制数字 0~9
isxdigit十六进制数字,包括所有十进制数字,小写字母a-f,大写字母A-F
islower小写字母a~z
isupper大写字母A~Z
isalpha字母a-z或A-Z
isalnum字母或者数字,a-z,A-Z,0-9
ispunct标点符号,任何不属于数字或者字母的图形字符(可打印)
isgraph任何图形字符
isprint任何可打印字符,包括图形字符和空白字符

这些函数都很简单根据意思使用就行,下面简单用几个。

// 字符串分类函数使用
int main()
{//检查是否为小写字符if (islower('c')){printf("是小写字符");}return 0;
}

在这里插入图片描述

字符转换函数

int tolower ( int c ); // 将大写转化小写
int toupper ( int c );//将小写转化为大写

//tolower的使用
int main()
{char arr[] = { "Hello WoRD" };for (int i = 0; i < sizeof(arr); i++){//大写转化为小写arr[i]=tolower(arr[i]);}printf("%s", arr);return 0;
}

在这里插入图片描述

toupper的使用,是一样的,这里就不展示了,读者可以自己尝试一下。

内存拷贝函数(memcpy)

memcpy的声明和使用

void * memcpy ( void * destination, const void * source, size_t num );

在这里插入图片描述

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

使用

//memcpy的拷贝整形使用
int main()
{int arr[] = { 1,2,3,4,5,6,7,8 };int arr1[15];memcpy(arr1, arr, sizeof(arr));for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++){printf("%d ", arr1[i]);}return 0;}

在这里插入图片描述

memcpy函数的模拟实现

//memcpy模拟实现
void* my_memcpy(void* des, const void* sour, size_t num)
{//assert(des && sour);while (num){*(char*)des = *(char*)sour;++(char*)des;++(char*)sour;num--;}
}

内存拷贝函数(memmove)

memmove的声明和使用

void * memmove ( void * destination, const void * source, size_t num );
  • 和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。
  • 如果源空间和目标空间出现重叠,就得使用memmove函数处理。
    使用
int main()
{int arr[] = { 1,2,3,4,5,6,7,8 };memmove(arr, arr + 2, 16);for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++){printf("%d ", arr[i]);}return 0;
}

在这里插入图片描述

memmove模拟实现

在这里插入图片描述

有重叠部分时

  • 当des小于sour的地址时从前向后拷贝。
  • 当des大于sour的地址时从后向前拷贝

没重叠部分时

  • 从前向后拷贝、从后向前拷贝都可以。
void* my_memmove(void* des, const void* sour, size_t num)
{assert(des&& sour);void* ret = des;//从前向后拷贝if (des < sour){while (num){*(char*)des = *(char*)sour;++(char*)des;++(char*)sour;num--;}return ret;}//从后向前拷贝while (num--){*((char*)des + num) = *((char*)sour + num);}return ret;
}

内存比较函数(memcmp)

memcmp的声明和使用

int memcmp ( const void * ptr1,  const void * ptr2, size_t num ); 

在这里插入图片描述

  • 比较从ptr1和ptr2指针开始的num个字节
  • 请注意,与 strcmp 不同,该函数在找到 null 字符后不会停止比较。
  • 返回值如下:
    在这里插入图片描述
    使用
int main () 
{ char buffer1[] = "DWgaOtP12df0"; char buffer2[] = "DWGAOTP12DF0"; int n; n=memcmp ( buffer1, buffer2, sizeof(buffer1) ); if (n>0) printf ("'%s' is greater than '%s'.\n",buffer1,buffer2); else if (n<0)printf ("'%s' is less than '%s'.\n",buffer1,buffer2); else printf ("'%s' is the same as '%s'.\n",buffer1,buffer2); return 0; 
} 

在这里插入图片描述

内存设置函数(memset)

memset的使用

void * memset ( void * ptr, int value, size_t num );

在这里插入图片描述

  • 把ptr指向的前num个字节的空间设置成value的值。
int main()
{char arr[] = { "hello word" };memset(arr, 'x', 5);printf("%s", arr);
}

在这里插入图片描述


最后

感谢大家的观看, 大家可以在评论区留言,你们的支持就是我最大的动力。

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

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

相关文章

如何解决在idea中的hadoop日志错误

在idea中操作hadoop的时候&#xff0c;每次运行代码都会发现有个日志错误&#xff0c;虽然不影响程序运行&#xff0c;但是无法打印日志。这是缺少依赖&#xff0c;和windows上缺少log4j的文件 解决方案&#xff1a; 1、导入slf4j依赖 2、导入hadoop中的log4j文件 1、从hado…

Datawhale X 李宏毅苹果书 AI夏令营 《深度学习详解》第十九章 ChatGPT

19.1 ChatGPT 简介和功能 1、对话框可以输入任何东西 2、可以继续追问 19.2 对于 ChatGPT 的误解 1、第一个误解是 ChatGPT 的回答是罐头讯息 2、另外一个常见的误解是 ChatGPT 的答案是网络搜索的结果 3、那 ChatGPT 真正在做的事情是什么呢&#xff1f;一言以蔽之就是做…

开放式激光振镜运动控制器在Ubuntu+Qt下的文本标刻

开放式激光振镜运动控制器在UbuntuQt下的文本标刻 上节课程我们讲述了如何通过UbuntuQt进行振镜校正&#xff08;详情点击→开放式激光振镜运动控制器在UbuntuQt下的激光振镜校正&#xff09;&#xff0c;本节文本标刻是在振镜校正的前提下实现的。 在正式学习之前&#xff0…

F12抓包08:查看网站Cookie

课程大纲 1、查看Cookie 1. 应用界面查看&#xff1a;按F12进入浏览器的开发者模式 - “应用”&#xff08;Application&#xff09; - Cookie&#xff0c;可查看Cookie并进行增、删、改、查操作。 2. 控制台命令行查看&#xff1a;按F12进入浏览器的开发者模式 - “控制台”&…

2025年第八届计算机图形和虚拟国际会议(ICCGV 2025)即将召开!

2025年第八届计算机图形和虚拟国际会议&#xff08;ICCGV 2025&#xff09;将于2025年2月21-23日在中国成都举行。随着信息技术的飞速发展&#xff0c;计算机图形学与虚拟现实技术正以前所未有的速度重塑着我们的认知世界与交互体验。从沉浸式游戏到精准医疗模拟&#xff0c;从…

坐牢第三十八天(Qt)

1、使用Qt绘画事件处理画一个闹钟 widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QDebug> #include <QPaintEvent>//画画处理事件 #include <QPainter>//画画 #include <QTime> //时间类 #include <QTimer>…

电流互感器电压互感器

一&#xff0c;电流互感器 用途&#xff1a;对信号做精确采样和适当补偿功能&#xff0c;方便对5A以内的交流电进行信号采集。主要作用就是对电流进行测量和取样。 扩展&#xff1a;对应输出模拟交流信号可以调节&#xff0c;可根据电位器&#xff08;调节放大比例&#xff0…

Ali_Yun Port

Ali_Yun Port 云服务器端口

基于云原生向量数据库 PieCloudVector 的 RAG 实践

近年来&#xff0c;人工智能生成内容&#xff08;AIGC&#xff09;已然成为最热门的话题之一。工业界出现了各种内容生成工具&#xff0c;能够跨多种模态产生多样化的内容。这些主流的模型能够取得卓越表现&#xff0c;归功于创新的算法、模型规模的大幅扩展&#xff0c;以及海…

FlinkCDC 3.2.0 新增优点 Pattern Replacement in routing rules

新增优点&#xff1a;Pattern Replacement in routing rules flinkcdc 3.2.0版本相较于3.1.0版本&#xff0c;避免了多表多sink多次写 route 路由的麻烦&#xff0c;类似于统一前后缀的形式多表多sink&#xff0c;通过<>正则&#xff0c;大大减少了书写 官网&#xff1…

【干货分享】Ftrans安全数据交换系统 搭建跨网数据传输通道

安全数据交换系统是一种专门设计用于在不同的网络、系统或组织之间安全地传输数据的软件或硬件解决方案。这种系统通常包含多种安全特性&#xff0c;以确保数据在传输过程中的保密性、完整性和可用性。 安全数据交换系统可以解决哪些问题&#xff1f; 安全数据交换系统主要解…

图分类!!!

deepwalk 使用图中节点与节点的共现关系来学习节点的向量表示。那么关键的问题就是如何来描述节点与节点的共现关系&#xff0c;DeepWalk给出的方法是使用随机游走(RandomWalk)的方式在图中进行节点采样,RandomWalk是一种可重复访问已访问节点的深度优先遍历算法。给定当前访问…

CogView-3-Plus:深度解锁智谱AI的图像生成新力量

一、引言&#xff1a;AI助力创意与效率的全面提升 在如今这个瞬息万变的科技时代&#xff0c;AI大模型早就不是实验室里的“神秘武器”&#xff0c;它们已经实实在在地融入到我们的日常工作中了&#xff0c;尤其是在图像生成和内容创作这块儿&#xff0c;简直是效率神器。只要几…

微软 Power Apps MDA 模型驱动应用解决Image字段查询出来缩略图问题变原图方法(c#+Plugin方式)

微软 Power Apps MDA 模型驱动应用解决Image字段查询出来缩略图问题变原图方法&#xff08;c#Plugin方式&#xff09; 在某些特定的场景中&#xff0c;需要将Image字段中的图片取出来&#xff0c;一般来说直接查询这个字段可以直接取&#xff0c;取出来的就是一个Base64格式的图…

OpenHarmony鸿蒙( Beta5.0)智能窗户通风设备开发详解

鸿蒙开发往期必看&#xff1a; 一分钟了解”纯血版&#xff01;鸿蒙HarmonyOS Next应用开发&#xff01; “非常详细的” 鸿蒙HarmonyOS Next应用开发学习路线&#xff01;&#xff08;从零基础入门到精通&#xff09; “一杯冰美式的时间” 了解鸿蒙HarmonyOS Next应用开发路…

springboot luttuc redis 集成protobuf,手动序列化反序列化

前置需知&#xff1a; 1.本文章和网上大部分博客配置不太一样&#xff0c;各位看官要分析一下自己的需求。集成protobuf 本文章主要是手动调用protobuf的序列化方法&#xff0c;而不是交由springboot 去做&#xff0c;会偏向原生java 使用方式 2.由于为了和公司其他的项目达成…

工业机器人9公里远距离图传模块,无人机低延迟高清视界,跨过距离限制

在科技日新月异的今天&#xff0c;无线通信技术正以未有的速度发展&#xff0c;其中&#xff0c;图传模块作为连接现实与数字世界的桥梁&#xff0c;正逐步展现出其巨大的潜力和应用价值。今天&#xff0c;我们将聚焦一款引人注目的产品——飞睿智能9公里远距离图传模块&#x…

前端Excel热成像数据展示及插值算法

&#x1f3ac; 江城开朗的豌豆&#xff1a;个人主页 &#x1f525; 个人专栏:《 VUE 》 《 javaScript 》 &#x1f4dd; 个人网站 :《 江城开朗的豌豆&#x1fadb; 》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 目录 &#x1f4d8; 前言 &#x1f4d8;一、热成像数…

Linux s3c2440 开发板上的操作系统实现 ubuntu

使用s3c2440开发板 使用ubuntu 1.ubuntu中的tftp&#xff0c;和nfs Trivial File Transfer Protocol,简单文件 传输协议。 通过网络在客户端与服务器之间进行简单文件 传输。提供不复杂、开销不大的文件传输服务。 Network File System&#xff0c;网络文件系统。通过 网络…

如何显示Dialog窗口

文章目录 1. 概念介绍2. 使用方法2.1 Overlay效果2.1 Dialog效果 3. 示例代码4. 内容总结 我们在上一章回中介绍了"使用get显示snackBar"相关的内容&#xff0c;本章回中将介绍使用get显示Dialog.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我们在…