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

这篇具有很好参考价值的文章主要介绍了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函数的参数。

C/C++字符函数和字符串函数详解————内存函数详解与模拟,C语言进阶,c语言

        我们看到函数的参数是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;
}

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

C/C++字符函数和字符串函数详解————内存函数详解与模拟,C语言进阶,c语言

接下来进行函数的模拟

#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*类型然后一个字节一个字节进行修改,但是这个函数有一定的局限性,当它的目的指针和来源指针指向同一数据且有有重叠部分时函数会出现与预期不同的结果,我们可以简单画一下:

C/C++字符函数和字符串函数详解————内存函数详解与模拟,C语言进阶,c语言

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

C/C++字符函数和字符串函数详解————内存函数详解与模拟,C语言进阶,c语言

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

3.memmove函数

        我们同样进入cplusplus网站查看memmove函数的参数,以及功能C/C++字符函数和字符串函数详解————内存函数详解与模拟,C语言进阶,c语言

           我们看到函数的参数是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;

}

运行结果如下:

C/C++字符函数和字符串函数详解————内存函数详解与模拟,C语言进阶,c语言

接下啦我们进行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前面

C/C++字符函数和字符串函数详解————内存函数详解与模拟,C语言进阶,c语言这种情况我们只需从前往后进行赋值即可。对于第二种

C/C++字符函数和字符串函数详解————内存函数详解与模拟,C语言进阶,c语言 str1在str2的后面我们不能从前向后进行拷贝,否则就会出现重复赋值,出现错误,这时我们只需要从后往前进行赋值就可以解决。

4.memset函数

         我们进入cplusplus网站进行查阅C/C++字符函数和字符串函数详解————内存函数详解与模拟,C语言进阶,c语言

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

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

运行结果如下:

C/C++字符函数和字符串函数详解————内存函数详解与模拟,C语言进阶,c语言

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

#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网站查看函数的参数 

C/C++字符函数和字符串函数详解————内存函数详解与模拟,C语言进阶,c语言

        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;
}

我们可以理解为 

C/C++字符函数和字符串函数详解————内存函数详解与模拟,C语言进阶,c语言

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

C/C++字符函数和字符串函数详解————内存函数详解与模拟,C语言进阶,c语言 

接下来进行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;
}

今天的内容就结束了,希望大家可以学到一些东西。文章来源地址https://www.toymoban.com/news/detail-714054.html

到了这里,关于C/C++字符函数和字符串函数详解————内存函数详解与模拟的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C语言:字符函数和字符串函数详解及部分函数的模拟实现(前篇)

    前言: C语言中对 字符和字符串 的处理很是频繁,但是C语言本身是没有字符串类型的, 字符串通常放在 常量字符串 中或者 字符数组 中。 字符串常量 适用于那些对它不做修改的字符串函数。 本篇文章将会 重点介绍处理字符和字符串的库函数的使用和注意事项。 strlen函数

    2024年02月06日
    浏览(34)
  • C语言之字符串,内存操作函数详解(一)

    💓博主CSDN主页:杭电码农-NEO💓   ⏩专栏分类:C语言学习分享⏪   🚚代码仓库:NEO的学习日记🚚   🌹关注我🫵带你学习更多C语言知识   🔝🔝 C语言的标准库为我们提供了丰富的字符串操作函数与内存操作函数,有我们熟悉的 strlen ,strcpy ,也有我们不熟悉的 strchr , strstr 等

    2024年02月08日
    浏览(39)
  • 【我爱C语言】详解字符函数isdigit和字符串转换函数(atoi和snprintf实现互相转换字符串)&&三种strlen模拟实现

    🔍个人主页 : @啊森要自信的主页 ✏️ 真正相信奇迹的家伙,本身和奇迹一样了不起啊! 欢迎大家关注🔍点赞👍收藏⭐️留言📝希望看完我的文章对你有小小的帮助,如有错误,可以指出,让我们一起探讨学习交流,一起加油鸭。 本小节我们将学习字符分类函数,字符

    2024年02月04日
    浏览(41)
  • 【再识C进阶3(上)】详细地认识字符串函数、进行模拟字符串函数以及拓展内容

           小编在写这篇博客时,经过了九一八,回想起了祖国曾经的伤疤, 勿忘国耻,振兴中华!加油,逐梦少年! 💓作者简介: 加油,旭杏,目前大二,正在学习 C++ , 数据结构 等👀 💓作者主页:加油,旭杏的主页👀 ⏩本文收录在:再识C进阶的专栏👀 🚚代码仓库

    2024年02月07日
    浏览(29)
  • 【C语言】字符函数,字符串函数,内存函数

    大家好!今天我们来学习C语言中的字符函数,字符串函数和内存函数。 目录 1. 字符函数 1.1 字符分类函数 1.2 字符转换函数 1.2.1 tolower(将大写字母转化为小写字母) 1.2.2 toupper(将小写字母转化为大写字母) 2. 字符串函数 2.1 字符串输入函数 2.1.1 gets() ​2.1.2 fgets() 2.2 字符串

    2024年02月10日
    浏览(46)
  • 进阶C语言-字符函数和字符串函数

    ✅注意事项: 字符串以 \\\'\\0\\\' 作为结束标志, strlen函数 返回的是在字符串中 \\\'\\0\\\' 前面出现的字符个数(不包括 \\\'\\0\\\' ) 参数指向的字符串必须以 \\\'\\0\\\' 结束 注意函数的返回值是 size_t ,是无符号的 ✅运行示例: 🔭1.1.1strlen函数的模拟实现 📖1.计数器法 assert函数 的 作用 是断言,

    2024年02月04日
    浏览(39)
  • 字符串函数+内存函数(详解)

    本期带大家一起来学习字符串函数+内存函数😀 😃 😄 1. 求字符串长度 strlen🚀🚀 字符串 已经 ‘\\0’ 作为结束标志 ,strlen函数返回的是在字符串中 ‘\\0’ 前面出现的字符个数(不包含 ‘\\0’ )。 strlen在库里面的参数是如此的 ⌛️⌛️ 接下来我们来模拟实现strlen ,接下来

    2023年04月17日
    浏览(34)
  • <C语言> 字符串内存函数

    C语言中对字符和字符串的处理很是频繁,但是C语言本身是没有字符串类型的,字符串通常放在 常量字符串 或者 字符数组 中。 字符串常量 适用于那些对它不做修改的字符串函数. 注意:字符串函数都需要包含头文件string.h strlen() 函数用于计算字符串的长度,即字符串中字符

    2024年02月15日
    浏览(35)
  • 字符串函数和内存函数详解(2)

    🐵本文会将会对剩余的 字符串库函数 和 内存函数 进行讲解 strstr函数原型: strstr用于在字符串中找子串,strstr会返回str1中出现str2的起始地址,如果在str1中没有找到str2,则返回空指针 strstr会返回arr1中第一次出现arr2的地址,这里就是\\\'l\\\'的地址,将其传给指针ret,在打印时

    2024年02月07日
    浏览(29)
  • 高阶C语言|字符函数和字符串函数--函数的模拟实现

    C语言中对字符和字符串的处理很是频繁,但是C语言本身是没有字符串类型的,字符串通常放在 常量字符串 中或者 字符数组 中。 字符串常量 适用于那些对它不做修改的字符串函数 size_t代表strlen函数返回的是一个无符号整形,str指向的是字符串,接收字符串的地址 字符串已

    2024年02月16日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包