【C语言】memcmp、memcpy、memmove、memset、memchr函数详解

目录

一、综述

二、介绍

1、memcmp

2、memcpy

3、memmove

4、memset

5、memchr


一、综述

memcmp、memcpy、memmove、memset、memchr都是C语言中的库函数,在头文件string.h中。

memcmp用于比较内存中缓冲区的大小。

memcpy和memmove的作用是拷贝一定长度的内存的内容。

memset用于缓冲区的填充工作。

memchr用于字符的查找工作。

二、介绍

1、memcmp

描述:

C 库函数 int memcmp(const void *str1, const void *str2, size_t n)) 把存储区 str1 和存储区 str2 的前 n 个字节进行比较。

函数申明:
int memcmp(const void *str1, const void *str2, size_t n);

参数:
str1:指向内存块的指针。
str2:指向内存块的指针。
n:要被比较的字节数。

返回值:
如果返回值 > 0,则表示 str1 大于 str2。(VS编译器下返回值为 1)
如果返回值 = 0,则表示 str1 等于 str2。(VS编译器下返回值为 0)
如果返回值 < 0,则表示 str1 小于 str2。(VS编译器下返回值为 -1)

注意:
如果两个字符串相同且n的值大于字符串长度的话,不会在\0出现停下程序,会继续往后进行比较,直到达到n次数

例如:

#include 
#include 
int main()
{
char *a = "aBcDeF";
char *b = "AbCdEf";
char *c = "aacdef";
char *d = "aBcDeF";

printf("memcmp(a, b):%d\n", memcmp((void*)a, (void*)b, 6));
printf("memcmp(a, c):%d\n", memcmp((void*)a, (void*)c, 6));
printf("memcmp(a, d):%d\n", memcmp((void*)a, (void*)d, 6));
}

运行结果:
memcmp(a, b):1 
memcmp(a, c):-1 
memcmp(a, d):0 


详解: memcmp((void*)a, (void*)c, 6)
比较前6个字节,一个字节一个字节的比较
ASCII码:一个英文字母(不分大小写)占用一个字节的空间,一个汉字占用两个字节的空间
故:char *a = "aBcDeF";  这里是6个字节
    char *c = "aacdef";  这里是6个字节
比较第二个字节时,根据ASCII码值,B

 2、memcpy

描述:

C 库函数 void *memcpy(void *str1, const void *str2, size_t n) 从存储区 str2 复制 n 个字节到存储区 str1

函数申明:
void *memcpy(void *destin, void *source, unsigned n);

参数:
destin:指向用于存储复制内容的目标数组,类型强制转换为 void* 指针。
source:指向要复制的数据源,类型强制转换为 void* 指针。
n:要被复制的字节数。

返回值:
该函数返回一个指向目标存储区destin的指针。

例如:

#include 
#include 
int main()
{
 int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };
 int arr2[10] = { 0 };
  
memcpy(arr2,arr1,20);

int i = 0;
 for ( i = 0; i < 10; i++)
  {
    printf("%d ", arr2[i]);
  }
}


运行结果:
1 2 3 4 5 0 0 0 0 0 

详解:
将arr1里的20个字节拷贝到arr2中,int类型数组一个元素大小占4个字节,则需拷贝五个元素

3、memmove

描述:

C 库函数 void *memmove(void *str1, const void *str2, size_t n) 从 str2 复制 n 个字符到 str1,但是在重叠内存块这方面,memmove() 是比 memcpy() 更安全的方法。如果目标区域和源区域有重叠的话,memmove() 能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中,复制后源区域的内容会被更改。如果目标区域与源区域没有重叠,则和 memcpy() 函数功能相同。

函数申明:
void *memmove(void *str1, const void *str2, size_t n)

参数:
str1:指向用于存储复制内容的目标数组,类型强制转换为 void* 指针。
str2:指向要复制的数据源,类型强制转换为 void* 指针。
n:要被复制的字节数。

返回值:
该函数返回一个指向目标存储区 str1 的指针。

例如:

    1、拷贝其他函数:

#include 
#include 

int main ()
{
   const char dest[] = "oldstring";
   const char src[]  = "newstring";

   printf("Before memmove dest = %s, src = %s\n", dest, src);
   memmove(dest, src, 9);
   printf("After memmove dest = %s, src = %s\n", dest, src);
   return(0);
}


运行结果:
Before memmove dest = oldstring, src = newstring
After memmove dest = newstring, src = newstring

详解:
 memmove(dest, src, 9);
 src里的9个字节复制给dest

   2、拷贝本身:

#include 
#include 
 
void print(int* arr,int sz)
{
	for (int i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
}
 
int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	memmove(arr + 1, arr + 3, 20);
	int sz = sizeof(arr) / sizeof(arr[0]);
	print(arr, sz);
	printf("\n");
	return 0;
}

运行结果:
1 4 5 6 7 8 7 8 9 10 

4、memset

描述:
C 库函数 void *memset(void *str, int c, size_t n) 复制字符 c(一个无符号字符)到参数 str 所指向的字符串的前 n 个字符。

函数声明:
void *memset(void *str, int c, size_t n)

参数:
str:指向要填充的内存块。
c:要被设置的值。该值以 int 形式传递,但是函数在填充内存块时是使用该值的无符号字符形式。
n:要被设置为该值的字符数。

返回值:
该值返回一个指向存储区 str 的指针。

例如:

#include 
#include 
 
int main ()
{
   char str[50];
 
   strcpy(str,"This is string.h library function");
   puts(str);
 
   memset(str,'$',7);
   puts(str);
   
   return(0);
}

运行结果:
This is string.h library function
$$$$$$$ string.h library function

5、memchr

描述:

C 库函数 void *memchr(const void *str, int c, size_t n) 在参数 str 所指向的字符串的前 n 个字节中搜索第一次出现字符 c(一个无符号字符)的位置。

函数声明:
void *memchr(const void *str, int c, size_t n)

参数:
str:指向要执行搜索的内存块。
c:以int 形式传递的值,但是函数在每次字节搜索时是使用该值的无符号字符形式。
n:要被分析的字节数。

返回值:
该函数返回一个指向匹配字节的指针,如果在给定的内存区域未出现字符,则返回 NULL。

例如:

#include 
#include 
 
int main ()
{
   const char str[] = "http://www.runoob.com";
   const char ch = '.';
   char *ret;
 
   ret = (char*)memchr(str, ch, strlen(str));
 
   printf("|%c| 之后的字符串是 - |%s|\n", ch, ret);
 
   return(0);
}

运行结果:
|.| 之后的字符串是 - |.runoob.com|

你可能感兴趣的:(C语言,c语言,c++,开发语言)