C/C++字符函数和字符串函数详解————内存函数详解与模拟

C/C++常用的字符串函数 字符串函数(String processing function)也叫字符串处理函数,指的是编程语言中用来进行字符串处理的函数,需要调用头文件include。在C/C++编程中经常会遇到字符串的处理,比如路径的切割、信号的判断(字符串比较),以及字符串大小的计算,熟练掌握常用的字符串函数,了解其可以实现的功能,对于做项目大有裨益。 阅读详情

个人主页:点我进入主页

专栏分类:C语言初阶      C语言程序设计————KTV       C语言小游戏     C语言进阶

C语言刷题

欢迎大家点赞,评论,收藏。

一起努力,一起奔赴大厂。

目录

1.前言

2 .memcpy函数

3.memmove函数

4.memset函数

 5.memcmp函数


1.前言

           前面学习了关于长度受限制的字符串函数和长度不受限制的字符串函数,其中strcmp对应strncmp函数,strcpy函数对应strncpy函数,strcat函数对应strncat函数,今天我们主要了解的是四个内存函数他们分别是memcpy函数,memmove函数,memset函数,memcmp函数。其中memcpy函数和strcpy函数的功能类似,memcmp函数和strcmp函数类似,接下来就让我们感受一下这些函数的魅力吧。

2 .memcpy函数

        对于memcpy函数,有很多人都是第一次接触到,我们进入cplusplus网站cplusplus进行查看memcpy函数的参数。

        我们看到函数的参数是void * destination, const void * source, size_t num,对于参数我们需要知道这个函数是有什么功能,它主要就是对任何类型的数据进行拷贝,所以destination和source都是void*类型,因为void*类型可任盛放任何类型的指针,其中destination是指向目标的指针,source是指向来源的指针,num是想要拷贝几个字节,接下来进行代码演示,代码如下:

#include<stdio.h>
#include <string.h>
int main()
{
	int arr1[10] = { 0 };
	int arr2[5] = { 2,3,4,5,6 };
	memcpy(arr1, arr2, 20);
	int i;
	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr1[i]);
	}
	return 0;
}

 我么运行代码,结果如下:

接下来进行函数的模拟

#include<stdio.h>
#include <string.h>
void* my_memcpy(void* str1, const void* str2, size_t num)
{
	char* p = (char*)str1;
	while (num--)
	{
		*(char*)str1 = *(char*)str2;
		str1 = (char*)str1 + 1;
		str2 = (char*)str2 + 1;
	}
	return p;
}
int main()
{
	int arr1[10] = { 0 };
	int arr2[5] = { 2,3,4,5,6 };
	my_memcpy(arr1, arr2, 20);
	int i;
	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr1[i]);
	}
	return 0;
}

        在这里我们需要进行强制转化,转化为char*类型然后一个字节一个字节进行修改,但是这个函数有一定的局限性,当它的目的指针和来源指针指向同一数据且有有重叠部分时函数会出现与预期不同的结果,我们可以简单画一下:

当我们想要把str1拷贝到str2上时当我们拷贝了前三个数据,str1和原来的str2重合时

         想要再次进行修改就会出现 重复拷贝,根据c语言的标准memcpy函数是对来自不同数据的进行拷贝,但是对于来自同一数组的需要用另外的一个函数,此函数就是memmove函数接下来我们介绍memmove函数。

3.memmove函数

        我们同样进入cplusplus网站查看memmove函数的参数,以及功能

           我们看到函数的参数是void * destination, const void * source, size_t num,memmove函数的功能和memcpy函数的功能类似 ,只是memmove是对于来自同一数组的数据进行拷贝,destination和source都是void*类型,因为void*类型可任盛放任何类型的指针,其中destination是指向目标的指针,source是指向来源的指针,num是想要拷贝几个字节,接下来进行代码演示,代码如下:

#include <stdio.h>
#include <string.h>
int main()
{
	int arr[10] = { 0,1,2,3,4,5,6,7,8,9};
	memmove(arr, arr + 3, 20);
	int i;
	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;

}

运行结果如下:

接下啦我们进行memmove函数的模拟实现,代码如下:

#include <stdio.h>
#include <string.h>
#include <assert.h>
void my_memmove(void* str1, const void* str2, size_t sz)
{
	assert(str1 && str2);
	if (str1 < str2)
	{
		while (sz--)
		{
			*(char*)str1 = *(char*)str2;
			str1 = (char*)str1 + 1;
			str2 = (char*)str2 + 1;
		}
	}
	else
	{
		while (sz--)
		{
			*((char*)str1 + sz) = *((char*)str2 + sz);
		}
	}
}
int main()
{
	int arr[10] = { 0,1,2,3,4,5,6,7,8,9 };
	my_memmove(arr+3, arr , 20);
	int i;
	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;

}

 在这里我们需要看两种情况,第一种是str1在str2前面

这种情况我们只需从前往后进行赋值即可。对于第二种

 str1在str2的后面我们不能从前向后进行拷贝,否则就会出现重复赋值,出现错误,这时我们只需要从后往前进行赋值就可以解决。

4.memset函数

         我们进入cplusplus网站进行查阅

        memset函数是对数据进行初始化的函数,这个数据可以是任意类型,但是字符串比较适用,ptr是指向想要修改的位置,value是想要修改为什么值,num是修改几个字节,我们直接进入代码演示,代码如下:

#include <stdio.h>
#include<string.h>
int main()
{
	char arr[] = "abcdefg";
	memset(arr, 'x', 4);
	printf("%s", arr);
	return 0;
}

运行结果如下:

接下来进入我们模拟实现,代码如下:

#include <stdio.h>
#include<string.h>
#include <assert.h>
void* my_memset(void* str, int vaul, size_t sz)
{
	assert(str);
	char* p = (char*)str;
	while (sz--)
	{
		*(char*)str = vaul;
		str = (char*)str + 1;
	}
	return p;
}
int main()
{
	char arr[] = "abcdefg";
	my_memset(arr, 'x', 4);
	printf("%s", arr);
	return 0;
}

 5.memcmp函数

        我们进入cplusplus网站查看函数的参数 

        memcmp函数的功能就是比较数据的大小,其中num是需要比较的数据的字节数,功能和strncmp类似,我们直接上代码:

 

#include <stdio.h>
#include <string.h>
int main()
{
	int arr[5] = { 0,1,2,3,4 };
	int arr1[5] = { 0 };
	int ret = memcmp(arr, arr1, 5);
	printf("%d", ret);
	return 0;
}

我们可以理解为 

前4个字节相同,第五个字节str1大于str2故返回1。运行结果如下;

 

接下来进行memcmp函数的模拟实现,代码如下:

#include <stdio.h>
#include <string.h>
#include <assert.h>
int my_memcmp(const void* str1, const void* str2, size_t sz)
{
	assert(str1 && str2);
	int i;
	for (i = 0; i < sz; i++)
	{
		if (*(char*)str1 >*(char*)str2)
		{
			return 1;
		}
		else if (*(char*)str1 < *(char*)str2)
		{
			return -1;
		}
		str1 = (char*)str1 + 1;
		str2 = (char*)str2 + 1;
	}
	return 0;
}
int main()
{
	int arr[5] = { 0,1,2,3,4 };
	int arr1[5] = { 0 };
	int ret = my_memcmp(arr, arr1, 5);
	printf("%d", ret);
	return 0;
}

今天的内容就结束了,希望大家可以学到一些东西。

c++中字符串操作函数合集 文章介绍了c++中常用的字符串操作函数及其用法 阅读详情

相关推荐

C++ 字符串常见函数全解析|高效处理文本的必备工具包

阳光透过半掩的百叶窗洒入整洁书房,原木书桌堆满编程书籍与咖啡杯,学生身着休闲装专注敲击键盘,紧盯 C++ 代码全神贯注

温情亿度网络科技 1228

C/C++字符串函数

在一些程序里面我们将会进行一系列的字符串操作,这些操作可以用一些函数进行简单的实现,对写代码效率和代码可读性具有重要意义。

闻道有先后,术业有专攻 6433

C语言中字符串和内存库函数的模拟实现

文章目录前言与字符串有关的库函数库函数strlenstrlen函数的使用strlen函数的模拟实现库函数strcpystrcpy函数的使用strcpy函数的模拟实现库函数strcmpstrcmp的使用strcmp函数的模拟实现库函数strcatstrcat函数的使用strcat函数的模拟实现库函数strstrstrstr函数的使用strstr函数的模拟实现与内存拷贝有关的函数库函数memcpymemcpy函数的使用memcpy函数的模拟实现库函数memmovememmove函数的使用memmove函数的模拟

JT_GUO的博客 1015

c/c++字符串操作函数及用法详解

1.strlen()函数 函数声明原型: 函数功能: 计算指定的字符串string的长度。 strlen函数实现: size_t strlen(const char *string); size_t my_strlen1(const char* string) { assert(string); size_t count = 0; while (*string++) { count++; } return count; } size_t my_strlen2(const char*

cat_eat_fish 6551

【C语言】strcat函数_字符串追加/连接

文章目录前言一、认识并使用strcat函数二、模拟实现strcat函数1.明确思路2.代码实现 前言 strcat函数又称字符串追加或字符串连接函数,函数的功能就是在一个字符串后面追加上另外一个字符串。 一、认识并使用strcat函数 1.库函数中strcat函数的声明->头文件string.h char* strcat(char* Destination, const char* source); 2.认识strcat函数 strcat函数最后返回的是目的地地址,所以返回类型是char*由于我

weixin_63449996的博客 8844

QGroundControl高级配置与自定义功能实战指南

本文深入探讨了QGroundControl(QGC)的高级配置与自定义功能,为无人机开发者、系统集成商和高级用户提供实战指南。内容涵盖从品牌界面定制、自定义MAVLink消息处理,到插件开发与自动化部署的全流程,旨在帮助用户解锁QGC的隐藏潜力,打造专属的行业解决方案。

weixin_29234509的博客 239

【C语言篇】字符和字符串以及内存函数的详细介绍与模拟实现(上篇)

字符和字符串是我们平常见比较多的数据,C语言对此也提供了一系列处理字符和字符串的函数,本篇在介绍的同时还对其进行了模拟实现,一起来看看吧!! 下一讲会介绍到剩下没有讲的的字符串函数和内存函数,敬请期待喔💕以上就是关于字符和字符串以及内存函数详细介绍(上篇)的内容啦啦,各位大佬有什么问题欢迎在评论区指正,您的支持是我创作的最大动力!❤️。

半截诗的博客~ 2330

基于级联H桥的储能变流器仿真与性能优化

本文深入探讨了基于级联H桥的储能变流器,通过仿真建模与性能优化,详细解析了其模块化结构、载波移相SPWM控制策略及核心性能指标。重点攻克了电池SOC均衡难题,介绍了利用零序电压注入实现相内均衡及功率调节实现相间均衡的实战策略,为提升储能系统效率与电池寿命提供了关键技术路径。

gpu4optimizer的博客 370

【C语言】字符串+内存函数及其模拟实现

strlen、strcpy、strcat等函数介绍及实现

qq_66314292的博客 1091

技能伤害继承英雄属性【War3地图编辑器】

风暴之锤跟随山丘之王的力量增长

ArYe 2302

Tailscale 自建 DERP 中继服务器

Tailscale自建DERP中继服务器

Accompagner的博客 4330

【C语言】strcpy()函数详解(字符串拷贝函数)

有关C语言库函数strcpy()函数的详解,内容包括:函数简介,参数及返回值分析,函数的具体使用示例,模拟编写程序实现strcpy()函数功能等相关内容.

C/C++领域,数据结构,linux,MySQl学习者 6万+

手把手教你学Simulink——基于新型电力电子拓扑与宽禁带器件的电网系统场景实例:GaN HEMT器件在高频逆变器中的开关特性建模

本文介绍了基于Simulink和Simscape Electrical的GaN HEMT高频逆变器建模方法。通过构建半桥拓扑电路,详细说明了GaN器件参数设置(以EPC2045为例)、专用驱动电路设计(含负压关断和米勒钳位)以及开关瞬态过程仿真(配置1ns步长捕捉MHz级特性)。重点分析了开关损耗计算和寄生导通风险,并对比了GaN与Si MOSFET的性能差异。案例展示了如何优化驱动参数和PCB布局,验证了GaN器件在1MHz高频应用中的优势(开关损耗仅5μJ)。最后总结了GaN在数据中心电源、无线充电等领

MHD0815的博客 403

C语言——字符函数、字符串函数和内存函数

C语言中有专门做字符分类的,也就是一个字符是属于什么类型的字符的,包含的头文件是以下是一些常见的函数。具体的应用方法,我们可以通过上面所给到的网页进行探索,此处省略。

2406_83392683的博客 1693

AI Agent开发大全第二十课-如何开发一个MCP(从0开发一个MCP Server)

大模型的MCP火了,可是无论是Claude官网本身自带Sample还是全网任何一本教程没有一个可以真正应用在生产环境中的。要么就是只能在本地以文件IO流的方式运行要么干脆连编译都出错,真正的mcp server和client是怎么编写的?如何运行在分布式环境?本教程就带大家真正从0开始以“AI计算食物热量“为例带大家真正学习mcp开发的全过程。

打造全国最全的AI Agent开发知识领域的博客 1802

5G 模组 FM650 USB模式查询及网络配置

完成以上配置后,5G模组可进行搜网,入网成功后,上位机获取 5G IP。

十年通信老兵的技术修炼之路——从3G到5G,从地面基站到卫星通信。 1323

C/C++ 字符与字符串

在C语言中,string 是定义一个字符串,存储的是一段如“abcd”的数据,而且最后还有一个结束符'\0'; char 是定义一个字符,存储一个字符,占一个字节。 在C++中,string有两种,一种是字符串char[],另外一种是封装好的字符串类,要区别理解。例如'a'是char, "a"是char string,这两者都是普通的字符和字符串,和C语言中没什么不同值得注意的是后者包含两个字符,末尾有一个隐身的'\0' 而 string str = "a" 是C++ 封装好的string。C++中的ch

生活需要深度 7549

uniapp(全端兼容) - 最新详细实现瀑布流列表及布局设计,uni-app全平台兼容的瀑布流示例,view容器自适应瀑布流布局,图片瀑布流布局、图像+文字卡片式瀑布流,类似小红书(详细示例代码)

uni-app,瀑布流,安卓app,苹果app,微信小程序,移动端,H5网页,手机网站,微信小程序、支付宝小程序,手机app端,nvue,瀑布流布局,如何实现图片瀑布流,怎么做文字+图像瀑布流,uniapp仿小红书笔记瀑布流效果,uniAPP仿快手抖音布局列表,瀑布流列表详细教程,编译所有平台都能用的瀑布流列表,商品瀑布流列表,图文列表,小程序瀑布流,页面触底懒加载,瀑布流插件,详细示例代码教程,uni-app H5实现瀑布流效果,uniapp小程序做瀑布流,纯css瀑布流,用uniapp写瀑布流商品列表,

✅ 精选推荐文章 1万+

详解字符串函数与内存函数【C语言/进阶】

合理高效地使用函数是一个程序员必不可少的技能,它能简洁高效的实现我们想要的功能。同时,在面试时一些函数的优缺点、原理也是面试官常问的问题。所以C的常用库函数对程序员是十分重要的。

Man9o 2072

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

一篇博客学会系列(1) —— C语言中所有字符串函数以及内存函数的使用和注意事项

不能字符串自己追加自己,因为当自己追加自己的时候,追加的过程中会将目标字符串的 '\0' 覆盖掉,而有因为此时目标字符串就是源字符串,就会导致源字符没有 '\0' ,将会一直拼接下去导致死循环。2、因为strlen返回的是 '\0' 前面的字符个数,如果字符串中间本身就一个'\0',那么返回的值就会返回字符串中的'\0'之前的字符个数。在实际开发中,我们不一定知道这个字符串是怎样的,这个字符串需要切割几次的,因此手动设置切割几次将代码写死的方式是不可取,而应该使用。如果真有自己追加自己的场景,建议使用。

Hacynn的博客 2066

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

C语言字符函数,字符串函数以及内存函数

2.第⼀个参数指定⼀个字符串,它包含了0个或者多个由sep字符串中⼀个或者多个分隔符分割的标 记。3.strtok函数找到str中的下⼀个标记,并将其用 \0 结尾,返回⼀个指向这个标记的指针。(注: strtok函数会改变被操作的字符串,所以被strtok函数切分的字符串⼀般都是临时拷贝的内容并且可修改。4.strtok函数的第⼀个参数不为 中的位置。NULL ,函数将找到str中第一个标记,strtok函数将保存它在字符串。

2402_86667364的博客 1167

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

字符串函数和内存函数

介绍一个很牛逼的网站cplusplus,c++的官方库,可以查到99%你在c++遇到的函数(注意我们用这些字符串函数时,可以进入C库-C++参考)这个网站上查询函数,可以看到官方库的函数是怎么个意思,很有价值,比在网上随便搜的正确性要高,不仅可以看到返回值,参数,还有使用场景等等,都可以看。用什么函数就搜什么函数就行,很方便注意我们用这些库函数的时候一定要包含头文件,比如strlen的头文件是string.h,大部分字符串函数都是这个头文件。

eixjdj的博客 1299

C语言笔记(字符串函数,字符函数,内存函数)

本文重点叙述字符串函数和内存函数,字符函数的使用简单并且较好理解,顺带一提字符函数。内存函数会列举四个 memcpy,menmove,memcmp,memset,重点放在字符串函数中。学习函数基本作用,并模拟函数是如何实现的,可以更好的理解函数。若有错误,请各位批评指正。

qq_58135952的博客 1263

【C语言】字符函数和字符串函数详解

strncpystrncatstrncmp。

编程知识点梳理、项目经验总结、学习方法分享 2197

《小猫猫大课堂》三轮3——字符函数和字符串函数及其模拟实现

字符串的使用 strlen​​​​​​​ const assert strcpy strcpy的模拟实现 strcat strcmp strcmp的应用及模拟实现 strncpy strncpy的应用 strncat strncmp strncmp的应用 strstr strtok strerror 字符分类函数 memcpy memmove memmove的应用及模拟实现 memcmp memcmp的模拟实现(VS下进行) memset memset的应用

ormstq的博客 1665

深入理解《字符串》及其函数——C语言

C语言字符串 字符串函数 📌strlen 函数模拟 📌strcpy 函数模拟 📌strcat 函数模拟 📌strcmp 函数模拟 📌strncpy 📌strncat 📌strstr 函数模拟 📌strtok 📌streeor 📌字符分类函数 内存函数 📌memcpy 函数模拟实现 📌memmove

一些七零八碎的知识点 3669
上一篇: C/C++字符函数和字符串函数详解————长度受限制的字符串函数
下一篇: C/C++之自定义类型(结构体,位段,联合体,枚举)详解
steventom
博客等级 码龄4年 720粉丝 80原创
评论 89
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

steventom

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值