目录
一、综述
二、介绍
1、memcmp
2、memcpy
3、memmove
4、memset
5、memchr
memcmp、memcpy、memmove、memset、memchr都是C语言中的库函数,在头文件string.h中。
memcmp用于比较内存中缓冲区的大小。
memcpy和memmove的作用是拷贝一定长度的内存的内容。
memset用于缓冲区的填充工作。
memchr用于字符的查找工作。
描述:
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++,开发语言)