内存函数memcmp和memset

这篇博客让我们再来认识两个内存函数,这两个函数也会在我们日后写代码过程中经常遇到的。


目录

1.memcmp(内存比较)

1.1认识函数

1.2函数示例

1.3模拟实现

2.memset(内存设置)

2.1认识函数

2.2函数示例

2.3模拟实现


1.memcmp(内存比较)

1.1认识函数

1.函数功能:比较内存中两个字符的大小,也就是比较大小函数

2.头文件:#include<string.h>

3.使用格式:int memcmp( const void *buf1, const void *buf2, size_t count );

4.函数比较buf1和buf2指针开始后的count个字节

5.函数的返回值:

       buf1>buf2,返回大于0的数

       buf1=buf2,返回0

       buf1<buf2,返回小于0的数

下面让我们来看一下具体实现

1.2函数示例

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>

//memcmp
int main()
{
	int arr1[] = { 1,2,3,4,5 };
	int arr2[] = { 1,2,5,6,7 };
	int ret = memcmp(arr1, arr2, 8);//这里的8代表的是字节数,而不是整型
	printf("ret=%d\n", ret);
	return 0;
}

相信很多小伙伴们不理解问什么ret的值就等于0了,下面我们来分析一下:

arr1 和arr2在内存中的存放位置是这样的(小端存储)

所以就是相等的。

1.3模拟实现


int my_memcmp(const void* ptr1, const void* ptr2, size_t count)
{
	assert(ptr1 && ptr2);
	while (--count)
	{
		if (*(char*)ptr1 == *(char*)ptr2)
		{
			 ptr1=(char*)ptr1 + 1;
			 ptr2=(char*)ptr2 + 1;
		}
		if (*(char*)ptr1 > *(char*)ptr2)
			return 1;
		if (*(char*)ptr1 < *(char*)ptr2)
			return -1;
	}
	return 0;
}
int main()
{
	int arr1[] = { 1,2,3,4,5 };
	int arr2[] = { 1,2,5,6,7 };
	int ret = my_memcmp(arr1, arr2, 8);
	printf("ret=%d\n", ret);
	return 0;
}

2.memset(内存设置)

2.1认识函数

1.函数功能:将内存设置为指定的字符,也就是以字节为单位设置内存中的数据

2.头文件:#include<string.h>或者#include<memory.h>

3.函数格式:void *memset( void *dest, int c, size_t count );

4.count:单位是字节

5.memset函数较多用来初始化一块内存,因为它是以字节为单位存放的,如果用来设置值,每个字节都会被设置为这一个值,最后结果肯定与我们需要设置的值不同:

加入,我们要把一个数组的每个值都设置为1,如代码所示:

int main()
{
	int arr[10] = { 0 };
	memset(arr, 1, 40);
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

我们看到运行结果并不是预期的每一个数都是1,这是因为,memset函数的单位是字节,也就是内存中计算的是01 01 01 01等40个01,然后一个整型是4个01,换成十进制是16843009

所以,我们一般不把memset函数用来设置值,这样不方便控制

我们通过代码来深度理解

2.2函数示例

//memset
int main()
{
	char arr[] = "hello world!!!";
	memset(arr, '*', 5);
	printf("%s",arr);
	return 0;
}

memset函数进行内存数据设置的时候,不仅能从字符串首地址设置,还能从字符串任意位置开始设置,比如我们要把world设置为“#”,这时,我们只需要让首地址+6,跳过hello和空格开始:

int main()
{
	char arr[] = "hello world!!!";
	memset(arr+6, '#', 5);
	printf("%s", arr);
	return 0;
}

2.3模拟实现

void my_memset(void* ptr, char value, size_t count)
{
	assert(ptr);
	while (count--)
	{
		*(char*)ptr = value;
		ptr = (char*)ptr+1;
	}
}
int main()
{
	char arr[] = "hello world!!!";
	my_memset(arr, '*', 5);
	printf("%s\n", arr);
	return 0;
}


这就是这两个函数了,希望大家可以理解!

### strcpy strcat 函数详解 `strcpy` 是用于字符串复制的标准库函数。它的功能是从源字符串 `src` 中复制内容到目标字符串 `dst`,直到遇到第一个 `\0` 字符为止[^3]。 ```c #include <stdio.h> #include <string.h> int main() { char src[] = "Hello"; char dst[50]; strcpy(dst, src); printf("Copied string: %s\n", dst); // 输出 Copied string: Hello return 0; } ``` 需要注意的是,如果目标缓冲区的空间不足以容纳完整的源字符串,则会发生溢出错误,可能导致程序崩溃或其他不可预测的行为[^1]。 `strcat` 则是用来连接两个字符串的函数。它会将第二个字符串追加到第一个字符串之后,并保留原始的第一个字符串的内容不变[^3]。 ```c #include <stdio.h> #include <string.h> int main() { char str1[50] = "Hello "; char str2[] = "World!"; strcat(str1, str2); printf("Concatenated string: %s\n", str1); // 输出 Concatenated string: Hello World! return 0; } ``` 同样地,使用 `strcat` 时也需要确保目标缓冲区有足够的空间来存储最终的结果字符串[^1]。 --- ### memcmp memset 函数详解及其区别 #### `memcmp` `memcmp` 用来比较两块内存区域中的数据是否相同。该函数接受三个参数:要比较的第一块内存地址指针、第二块内存地址指针以及待比较的字节数量。返回值表示两者之间的差异情况——当且仅当所有对应字节都相等时才返回零;否则依据首个不同字节处 ASCII 编码顺序决定正负号[^4]。 ```c #include <stdio.h> #include <string.h> int main() { unsigned char buf1[] = {'H','e','l','l','o'}; unsigned char buf2[] = {'h','e','l','l','o'}; int result = memcmp(buf1,buf2,5); if(result>0){ puts(">"); } else if(result<0){ puts("<"); } else{ puts("="); } return 0; } // 此例子中由于'H'(72)>'h'(104),所以输出"<" ``` #### `memset` 另一方面,`memset` 负责把一块连续的内存单元设置为特定值。此操作通常应用于初始化数组或者结构体成员变量至已知状态(比如全置零)之前。 ```c #include <stdio.h> #include <string.h> int main(){ char s[10]={0}; // 将前五个字符设成'x' memset(s,'x',5); printf("%s\n",s); // 输出 xxxxx\0\0... return 0; } ``` 尽管这两个函数都在处理内存方面发挥作用,但它们的目的完全不同:一个是对比现有数据集间的异同点,另一个则是修改指定范围内的数值[^4]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

月亮夹馍干

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

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

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

打赏作者

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

抵扣说明:

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

余额充值