strcpy、strncpy、memcpy、memove的区别
char *strcpy(char *dest, const char *src);
1.将src所指的字符拷贝到dest所指的空间内,直到拷贝完'\0'后停止拷贝。
2.dest所指的空间和src所指的空间不能有重叠,否则会相互覆盖。不能达到预期。
3.dest所指的空间要足够容纳src的所有字符,包括最末尾的'\0'。否则将会越界。
4.拷贝以src所指空间末尾的'\0'为结束条件,因此将有可能导致出现越界,空间重叠的问题。
大致实现:
const char* myStrcpy(char *dest, const char *src) { assert(dest != NULL && src != NULL); char *pBegin = dest; while ((*dest++ = *src++) != '\0') ; return pBegin; }
char *strncpy(char *dest, const char *src, size_t n);
1.从src所指的空间内拷贝n个字符到dest的空间内。
2.如果src不足n个字符,那么就用'\0'凑齐n个字符拷贝到dest内。
3.如果n个字符里面没有'\0',那么dest空间内将没有'\0'
4.dest空间要足够容纳n个字符,否则将出现越界。
大致实现:
char *myStrncpy(char *dest, const char *src, int n) { int i = 0; for (i = 0; i < n && src[i] != '\0'; ++i) { dest[i] = src[i]; } for (; i < n; ++i) { dest[i] = '\0'; } return dest; }
void *memcpy(void *dest, const void *src, size_t n);
1.从src所指的空间拷贝n个字节到dest所指的空间内。
2.和strncpy的区别是不会遇到'\0'就停止后续的拷贝。
3.n设置不当有越界的可能行。
4.内存不能重叠,否则相互覆盖
void *memmove(void *dest, const void *src, size_t n);
1.和memcpy的功能类似
2.允许src和dest所指的空间内存有重叠,能预期实现拷贝。
大致实现:
char *myMemmove(char *dest, const char *src, int n) { char *pBegin = dest; if (src > dest) { while(n--) { *dest++ = *src++; } } else if(src < dest) { while(n--) { *(dest-1+n) = *(src-1+n); } } return pBegin; }