了解了字符串函数后我们了解在内存中操作的函数,就叫内存函数。
memcpy函数
从source位置开始向后复制num个字节的数据到destination的内存位置
形式:void*memcpy(void*destination,const void*source,size_t num)
1.这个函数在遇到\0时不会停下来
2.如果source和destination有任何的重叠,复制的结果都是未定义的
下面我们来使用:
#include<stdio.h>
#include<string.h>
struct{
char name[40];
int age;
}person,person_copy;
int main(){
char myname[]="Lily";
memcpy(person.name,myname,strlen(myname)+1);//将myname长度和\0拷贝到person.name中
person.age=46;
memcpy(&person_copy,&person,sizeof(person));
printf("person_copy:%s,%d\n",person_copy.name,person_copy.age);
return 0;
}
memmove函数
从destination位置开始将source前num个字节拷贝到destination后面
形式:void*memmove(void*destination,const void*source,size_t num)
1.和memcpy的差别就是memmove可以处理原内存块和目标内存块中重合的部分,比如将同一个字符串后面的数据拷贝到前面
2.如果原空间与目标空间出现重叠,就必须用memmove函数
如果用memcpy来拷贝的话,我们看看结果:
int arr1[10]={1,2,3,4,5,6};
memcpy(arr1+2,arr1,20);
下面我们写一个函数来实现memcpy函数的功能:
void*mymemcpy(void*dest,const void*src,size_t count){
assert(dest&&src);
void*ret=dest;
while(count--){
*(char*)dest=*(char*)src;
dest=(char*)dest+1;
src=(char*)src+1;
}
return ret;
}
int main(){
int arr1[10]={1,2,3,4};
int arr2[5]={0};
mymemcpy(arr2,arr1,20);
return 0;
}
memcmp函数
比较从ptr1和ptr2开始的num个字节
形式:int memcmp(const void*ptr1,const void*ptr2,size_t num)
下面实现memmove函数:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(){
char buf1[]="abcdefg";
char buf2[]="abcdmno";
int n;
n=memcmp(buf1,buf2,sizeof(buf1));
if(n>0)
printf("'%s' is greater than '%s'\n",buf1,buf2);
else if(n<0)
printf("'%s' is less than '%s'\n",buf1,buf2);
else
printf("'%s' is as same as '%s'\n",buf1,buf2);
return 0;
}
下面我们写一个函数来实现memmove的功能:
void*mymemmove(void*dest,const void*src,size_t count){
assert(dest&&src);
char*ret=dest;
if(dest<src){
while(count--){
*(char*)dest=*(char*)src;
dest=*(char*)dest+1;
src=*(char*)src+1;
}
}
else{
while(count--){
*((char*)src+count)=*((char*)dest+count);
}
}
return ret;
}