手写strcpy、memcpy、memmove、strcat、strcmp
strcpy、strncpy都不安全,有strcpy_s安全版本
1.strcpy
不仅会复制字符串内容,且会复制字符串结尾符
char* strcpy(char* dest, const char* src) {
if (src == NULL || dest == NULL)
return NULL;
char *ret = dest;
while ((*dest ++ = *src ++) != '\0');
return ret;
}
2.strncpy
char* strncpy(char* dest, const char* src, int n) {
if (src == NULL || dest == NULL)
return NULL;
char *ret = dest;
while (n --) {
*dest ++ = *src ++;
}
*dest = '\0';
return ret;
}
3.strcat
char* strcat(char* dest, const char* src) {
if (dest == NULL || src == NULL)
return NULL;
char* ret = dest;
while (*dest)
++ dest;
while (*dest ++ = *src ++);
return ret;
}
4.strcmp
int strcmp(const char* s1, const char* s2) {
assert((s1 != NULL) && (s2 != NULL);
while (*s1 && *s2) {
if (*s1 != *s2)
break;
++ s1;
++ s2;
}
return *s1 - *s2;
}
5.memcpy
void* memcpy(void* dest, const void* src, int n) {
if (dest == NULL || src == NULL)
return NULL;
char* c_dest =(char *)dest;
char* c_src = (char *)src;
while (n --) {
*c_dest ++ = *c_src ++;
}
return dest;
}
6.memmove
void* memmove(void* dest, const void* src, int n) {
if (dest == NULL || src == NULL)
return NULL;
char* c_dest =(char *)dest;
char* c_src = (char *)src;
if ((src > dest) && (src < dest + n)) {
while (n --) {
*c_dest ++ = *c_src ++;
}
} else {
c_dest += n - 1;
c_src += n - 1;
while (n --) {
*c_dest -- = *c_src --;
}
}
return dest;
}