赞
踩
memcpy()的实现:
// A C implementation of memcpy() #include<stdio.h> #include<string.h> void myMemCpy(void *dest, void *src, size_t n) { //此处应加assert(dest != NULL && src != NULL); // Typecast src and dest addresses to (char *) char *csrc = (char *)src; char *cdest = (char *)dest; // Copy contents of src[] to dest[] for (int i=0; i<n; i++) cdest[i] = csrc[i]; } // Driver program int main() { char csrc[] = "GeeksforGeeks"; char cdest[100]; myMemCpy(cdest, csrc, strlen(csrc)+1); printf("Copied string is %s", cdest); int isrc[] = {10, 20, 30, 40, 50}; int n = sizeof(isrc)/sizeof(isrc[0]); int idest[n], i; myMemCpy(idest, isrc, sizeof(isrc)); printf("\nCopied array is "); for (i=0; i<n; i++) printf("%d ", idest[i]); return 0; }
memcpy有个问题就是当src和dst有重叠时,在copy过程中就会覆盖以后要copy的内容。此时应该用memmove。
下面的代码来自
原文链接:https://blog.csdn.net/z702143700/article/details/47107701
void* memmove(void* dst,const void* src,size_t count) { assert(NULL !=src && NULL !=dst); char* tmpdst = (char*)dst; char* tmpsrc = (char*)src; if (tmpdst <= tmpsrc || tmpdst >= tmpsrc + count) { while(count--) { *tmpdst++ = *tmpsrc++; } } else { tmpdst = tmpdst + count - 1; tmpsrc = tmpsrc + count - 1; while(count--) { *tmpdst-- = *tmpsrc--; } } return dst; }
也可以先从src拷贝到一个临时数组tmp,再从tmp拷贝到dest。不过这个空间复杂度是O(n)。
下面的代码来自
https://www.geeksforgeeks.org/write-memcpy/
//C++ program to demonstrate implementation of memmove() #include<stdio.h> #include<string.h> // A function to copy block of 'n' bytes from source // address 'src' to destination address 'dest'. void myMemMove(void *dest, void *src, size_t n) { // Typecast src and dest addresses to (char *) char *csrc = (char *)src; char *cdest = (char *)dest; // Create a temporary array to hold data of src char *temp = new char[n]; // Copy data from csrc[] to temp[] for (int i=0; i<n; i++) temp[i] = csrc[i]; // Copy data from temp[] to cdest[] for (int i=0; i<n; i++) cdest[i] = temp[i]; delete [] temp; } // Driver program int main() { char csrc[100] = "Geeksfor"; myMemMove(csrc+5, csrc, strlen(csrc)+1); printf("%s", csrc); return 0; }
strcpy()只能拷贝字符串,当遇到字符串末尾的NULL(‘\0’)时,它会删除该字符,并结束拷贝。
memcpy()可以拷贝任意类型的字符,不会考虑NULL字符,只拷贝所指定要拷贝的字符数。
一个strcpy的代码例子如下:
void *strcpy(char *strDest, const char *strSrc) {
assert(strDest != NULL & strSrc != NULL);
char *addr = strDest;
while ((*strDest++ = *strSrc++) != '\0');
return addr;
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。