目录
- 一、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断言也需要包含头文件。
欧耶!!! 我学会啦!!!