前言:在上一章,介绍了两个内存拷贝函数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介绍如下:
由图可知,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:对哪里有问题的朋友,可以在评论区留言,若哪里写的有问题,也欢迎朋友们在评论区指出,博主看到后会第一时间确定修改。最后,制作不易,希望朋友们给点点赞和关注。