目录
- 一、memcpy()
- 1.1声明
- 1.2参数
- 1.3返回值
- 1.4memcpy的使用
- 1.5memcpy模拟使用
- 1.6注意
- 二、memmove()
- 2.1声明
- 2.2参数
- 2.3返回值
- 2.4使用
- 2.5memmove()模拟实现
- 三、memset
- 3.1声明
- 3.2参数
- 3.3返回值
- 3.4使用
- 四、memcmp()
- 4.1声明
- 4.2参数
- 4.3返回值
- 4.4使用
- 五、注意
一、memcpy()
1.1声明
void *memcpy(void *dest, const void *src, size_t n)
1.2参数
dest – 指向用于存储复制内容的目标数组,类型强制转换为 void* 指针。
src – 指向要复制的数据源,类型强制转换为 void* 指针。
n – 要被复制的字节数。
1.3返回值
该函数返回一个指向目标存储区 str1 的指针。
1.4memcpy的使用
// 将字符串复制到数组 dest 中
#include<stdio.h>
#include<string.h>
int main()
{
const char src[50] = "http://www.runoob.com";
char dest[50]="****************";
memcpy(dest, src, 6);// 将字符串复制到数组 dest 中
printf("dest = %s\n", dest);
return 0;
}
1.5memcpy模拟使用
#include<stdio.h>
#include<assert.h>
#include<string.h>
char* my_memcpy(char* dest, const char* src,size_t n)
{
assert(dest && src);
char* ret = dest;
for (int i = 0; i < n; i++)
{
*(char*)dest = *(char*)src;
dest = (char*)dest+1;
src = (char*)src+1;
}
return ret;
}
int main()
{
const char src[50] = "http://www.runoob.com";
char dest[50]="****************";
char* ret=my_memcpy(dest, src, 6);// memcpy模拟实现
printf("dest = %s\n", ret);
return 0;
}
1.6注意
函数memcpy从src的位置开始向后复制num个字节的数据到dest指向的内存位置。
这个函数在遇到 ‘\0’ 的时候并不会停下来。
如果source和destination有任何的重叠,复制的结果都是未定义的。
对于重叠的内存可以用memmove来处理。
二、memmove()
2.1声明
void *memmove(void *str1, const void *str2, size_t n)
2.2参数
str1 – 指向用于存储复制内容的目标数组,类型强制转换为 void* 指针。
str2 – 指向要复制的数据源,类型强制转换为 void* 指针。
n – 要被复制的字节数。
2.3返回值
该函数返回一个指向目标存储区 str1 的指针。
2.4使用
#include<stdio.h>
#include<string.h>
int main()
{
char src[] = "http://www.runoob.com";
char dest[50] = "**********";
memmove(dest, src, 6);
printf("dest=%s", memmove(dest,src,6));
return 0;
}
2.5memmove()模拟实现
#include<stdio.h>
#include<assert.h>
#include<string.h>
char* my_memmove(char* dest, const char* src, size_t n)
{
char* ret = dest;
if (dest < src)
{
while (n--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
}
else
{
while (n--)
{
*(char*)(dest + n) = *(char*)(src + n);
dest = (char*)dest + 1;
src = (char*)src + 1;
}
}
return ret;
}
int main()
{
const char src[50] = "http://www.runoob.com";
char dest[50]="****************";
char* my_memmoves=my_memmove(dest, src, 6);//memmove模拟实现
printf("dest = %s\n", my_memmoves);
return 0;
}
三、memset
3.1声明
void *memset(void *str, int c, size_t n)
3.2参数
str – 指向要填充的内存块。
c – 要被设置的值。该值以 int 形式传递,但是函数在填充内存块时是使用该值的无符号字符形式。
n – 要被设置为该值的字节数。
3.3返回值
该值返回一个指向存储区 str 的指针。
3.4使用
#include <stdio.h>
#include <string.h>
int main ()
{
char str[50];
strcpy(str,"This is string.h library function");
puts(str);
memset(str,'$',7);
puts(str);
return(0);
}
运行结果
```c
This is string.h library function
$$$$$$$ string.h library function
四、memcmp()
4.1声明
int memcmp(const void *str1, const void *str2, size_t n)
4.2参数
str1 -- 指向内存块的指针。
str2 -- 指向内存块的指针。
n -- 要被比较的字节数。
4.3返回值
如果返回值 < 0,则表示 str1 小于 str2。
如果返回值 > 0,则表示 str1 大于 str2。
如果返回值 = 0,则表示 str1 等于 str2
4.4使用
#include <stdio.h>
#include <string.h>
int main ()
{
char str1[15];
char str2[15];
int ret;
memcpy(str1, "abcdef", 6);
memcpy(str2, "ABCDEF", 6);
ret = memcmp(str1, str2, 5);
if(ret > 0)
{
printf("str2 小于 str1");
}
else if(ret < 0)
{
printf("str1 小于 str2");
}
else
{
printf("str1 等于 str2");
}
return(0);
}
五、注意
他们都要包含头文件<string.h>,assert断言也需要包含头文件。
欧耶!!! 我学会啦!!!