一. strcpy函数
1. strcpy的原型是char* strcpy(char *des, const char *src); 返回des指针。
作用是把src指针指向的字符串复制到des指针指向的字符串中。
2. des所指向的内存空间要足够大保证能够容纳src所指的字符串,strcpy函数碰到第一个\0字符的时候结束复制
3. strcpy函数的实现,考虑内存重叠
//strcpy函数实现 char* strcpy(char *des, const char *src){ //空指针报异常 if(des == NULL || src == NULL){ throw exception("error"); return NULL; } //如果是自己复制自己直接返回 if(des == src){ return des; } //求出stc指向的字符串长度 int length = strlen(src); //考虑内存重叠 if((des > src) && (des < src+length)){ //从后往前复制 for(int i = length-1; i >= 0; i--){ des[i] = src[i]; } } else{ //从前往后复制 for(int i = 0; i < length; i++){ des[i] = src[i]; } } //最后一位赋值为\0 des[length] = '\0'; return des; }
二. memcpy函数
1. memcpy是C语言中的内存复制函数,它的函数原型是 void* memcpy(void *des, const void *src, size_t count),返回des指针变量。
作用是把src指向的内存地址空间中的count个字节复制到des指向的内存空间。
2. des和src所指向的内存空间是不能重叠的,memcpy可以复制任何数据类型,并且必须复制count个字节。
3. memcpy函数的实现,考虑内存重叠
void* memcpy(void *des, const void *src, size_t count){ //如果是空指针抛异常 if(des == NULL || src == NULL){ throw exception("error"); return NULL; } //如果自己复制自己直接返回 if(des == src){ return des; } //转化为字符指针类型 char *tmpDes = (char*)des; char *tmpSrc = (char*)src; //考虑内存重叠 if((tmpDes > tmpSrc) && (tmpDes < (tmpSrc+count))){ //从后往前复制 for(size_t i = count-1; i >= 0; i--){ //注意i是size_t类型 tmpDes[i] = tmpSrc[i]; } } else{ //从前往后复制 for(size_t i = 0; i < count; i++){ //注意i是size_t类型 tmpDes[i] = tmpSrc[i]; } } return des; }
三. strcpy和memcpy的区别
1. strcpy是用来复制字符串的,memcpy是用来复制一段内存的
2. strcpy复制字符串的时候遇到\0就结束,memcpy必须复制指定大小的内存才结束
时间: 2024-10-21 08:49:17