内存操作函数:memset,memcmp

前言:在上一章,介绍了两个内存拷贝函数memcpy,memmove。本章将继续介绍2个内存操作函数memset和memcmp。

memset

memset函数的功能是填充内存块。

cplusplus介绍如下:(仅供参考,看不懂也没关系)

在这里插入图片描述

由上图可知,memset具有3个参数,第一个参数ptr为指向要填充的内存块的指针,第2个参数value为要填充的值,第3个参数num为要填充的字节数。
通俗点说:将ptr指向的前面num个字节的内存块设置为指定的value

举以下例子,便于大家了解:

#include<stdio.h>
#include<string.h>     //引用字符串函数头文件
int main()
{
    
    
	char arr[] = "hello world";      //要填充的内存块
	memset(arr, 'x', 5);             //将arr数组前5个字节的值改为'x'
	printf("%s\n", arr);             //打印填充后的arr数组
	return 0;
}

输出结果如下:
在这里插入图片描述

使用注意事项

memset的作用至此一目了然,但需要注意的是,memset是一个字节一个字节的填充,在某些情况下可能出现意想不到的效果,具体请看以下代码:

#include<stdio.h>
#include<string.h>    //引用字符串函数头文件
int main()
{
    
    
	int arr[10] = {
    
     0 };     //设置一个初始变量全为0的数组arr
	memset(arr, 1, sizeof(arr));   //理想:将arr数组的变量全部赋值1
	for (int i = 0; i < 10; i++)   
	{
    
    
		printf("%d ", arr[i]);     //打印arr数组的地址
	}
	return 0;
}

输出结果如下:
在这里插入图片描述

可以看到上图输出结果并不是我们希望的1,这是因为memset是一个字节一个字节的填充,而1的十六进制表现为01(1个字节),因此每次都是填充01,无法将数据的每个元素都赋值为1.
在这里插入图片描述

memcmp

memcmp函数的功能是比较内存块大小,理解起来较为简单。在前面我们已经学过了strcpy,strncpy,但memcpy的适用性更加广泛。

cplusplus介绍如下:

扫描二维码关注公众号,回复: 14880042 查看本文章

在这里插入图片描述

由图可知,memcpy有3个参数,ptr1和ptr2为指向要比较的两个内存块的指针,num为要比较的字节数。

返回值
在这里插入图片描述

举以下例子,便于大家了解:

这里举个整型数组的例子,让大家体会到使用memcmp的方便之处

假设有这样的题目:请你输出两个整型数组arr1,arr2(都含有5个元素),然后判断它们是否相等?
若没学过memcmp,相信大家也能写出来类似下面这样的代码:

#include<stdio.h>
int main()
{
    
    
	int arr1[5] = {
    
     0 };
	int arr2[5] = {
    
     0 };
	int count = 0;     //计数器
	for (int i = 0; i < 5; i++)
	{
    
    
		scanf("%d", &arr1[i]);
	}
	for (int i = 0; i < 5; i++)
	{
    
    
		scanf("%d", &arr2[i]);
	}
	for (int i = 0; i < 5; i++)
	{
    
    
		if (arr1[i] == arr2[i])  count++;  //若一组对应元素相等,计数器加1
	}
	if (count == 5)  printf("相等\n");     //若计数器等于5,说明对应元素全部相等
	else printf("不相等\n");
	return 0;
}

但是这样不仅要多写一个循环,而且当遇到两数组元素大小不等的情况显得很棘手(不是指这题)。

而使用memcmp解决上面的题目代码如下:

#include<stdio.h>
#include<string.h>  //引用字符串函数头文件
int main()
{
    
    
	int arr1[5] = {
    
     0 };
	int arr2[5] = {
    
     0 };
	for (int i = 0; i < 5; i++)
	{
    
    
		scanf("%d", &arr1[i]);
	}
	for (int i = 0; i < 5; i++)
	{
    
    
		scanf("%d", &arr2[i]);
	}
	if ((memcmp(arr1, arr2, 20)) == 0)  printf("相等\n");   若memcmp返回值为0,说明二者相等
	else printf("不相等");
	return 0;
}

通过对比,memcmp的实用性一目了然。并且memcmp简单易上手,推荐大家一定要将其掌握。

文末BB:对哪里有问题的朋友,可以在评论区留言,若哪里写的有问题,也欢迎朋友们在评论区指出,博主看到后会第一时间确定修改。最后,制作不易,希望朋友们给点点赞和关注。

猜你喜欢

转载自blog.csdn.net/qq_73390155/article/details/129668255
今日推荐