void *memmove( void *dest, const void *src, size_t count );
memmove函数将count字节的字符从src复制到dest。
如果源区域和目标区域的某些区域重叠,memmove将确保在覆盖之前复制重叠区域中的原始源字节。
#define _CRT_SECURE_NO_WARNINGS 1 #include#include void* my_memmove(void* dst, const void* src, size_t count) { void* ret = dst; assert(dst); assert(src); //dst <= src表示,如果dst在src的前面,从前往后复制不会覆盖src中还没有复制的内容 if (dst <= src || (char*)dst >= ((char*)src + count)) { //从前往后复制,则不会出现覆盖src中没有复制的内容 while (count--) { *(char*)dst = *(char*)src; dst = (char*)dst + 1; src = (char*)src + 1; } } else { //从后往前复制,则不会出现覆盖src中没有复制的内容 dst = (char*)dst + count - 1;//移动到末尾 src = (char*)src + count - 1; while (count--) { *(char*)dst = *(char*)src; dst = (char*)dst - 1; src = (char*)src - 1; } } return ret; } int main() { char arr[10] = "abcdefg"; char arr0[10] = "abcdefg"; char arr1[10] = { 0 }; my_memmove(arr + 2, arr, 4); my_memmove(arr1, arr0, 4); printf("内存覆盖情况:%sn", arr + 2); printf("正常情况:%sn", arr1); return 0; }
运行结果:
二、memcpyvoid *memcpy( void *dest, const void *src, size_t count );
memcpy函数将src的count字节复制到dest。
如果源和目标重叠,此函数不能确保在覆盖之前复制重叠区域中的原始源字节。使用memmove处理重叠区域。
#define _CRT_SECURE_NO_WARNINGS 1 #include#include void* my_memcpy(void* dst, const void* src, size_t count) { void* ret = dst; assert(dst); assert(src); while(count--) { *(char*)dst = *(char*)src; dst = (char*)dst + 1; src = (char*)src + 1; } return ret; } int main() { char dst[] = "abcdefghigk"; char src[] = "hello world"; void* ret = my_memcpy(dst, src, 8); printf("%sn", (char*)ret); return 0; }
运行结果:
三、 strstrchar* strstr( const char* str1, const char* str2 );
在一个字符串中找子字符串
#define _CRT_SECURE_NO_WARNINGS 1 #include#include char* my_strstr(const char* str1, const char* str2) { assert(str1); assert(str2); char* cp = (char*)str1; char* substr = (char*)str2; char* s1 = NULL; if (*str2 == ' ') return NULL; while (*cp) { s1 = cp; substr = str2; while (*s1 && *substr && (*s1 == *substr)) { s1++; substr++; } if (*substr == ' ') return cp; cp++; } } int main() { char str1[] = "abcdefghi"; char str2[] = "bcd"; char* ret = my_strstr(str1, str2);//在arr1中找arr2字符串第一次出现的位置 if (ret != NULL) printf("%sn", ret); else printf("找不到字符串n"); return 0; }
运行结果:
四、strcatchar* strcat( char* dest, const char* src );
追加字符串
#define _CRT_SECURE_NO_WARNINGS 1 #include#include char* my_strcat(char* dest, const char* src) { assert(dest); assert(src); char* ret = dest; while (*dest) { dest++; } while (*dest++ = *src++) { ; } return ret; } int main() { char dest[20] = "hello "; char src[] = "world"; strcat(dest, src); printf("%sn", dest); return 0; }
运行结果:
五、strcmpint strcmp (const char* src, const char* dest);
字符串的比较
#define _CRT_SECURE_NO_WARNINGS 1 #include#include int my_strcmp(const char* src, const char* dest) { assert(src); assert(dest); int ret = 0; while (!(ret = *(unsigned char*)src - *(unsigned char*)dest) && *dest) ++src, ++dest; if (ret < 0) ret = -1; else if (ret > 0) ret = 1; return ret; } int main() { char src[] = "hello"; char dest[] = "world"; int ret = my_strcmp(src, dest); printf("%dn", ret); return 0; }
运行结果:
六、strcpychar* strcpy( char* Destination, const char* Source );
把含有’ ’结束符的字符串复制到另一个字符串中
#define _CRT_SECURE_NO_WARNINGS 1 #include#include char* my_strcpy(char* dest, const char* src) { assert(dest); assert(src); char* ret = dest; while (*dest++ == *src++) { ; } return ret; } int main() { char arr1[20] = "****************"; char arr2[] = "hello"; char* ret = my_strcpy(arr1, arr2); printf("%sn", ret); return 0; }
运行结果:
七、strlensize_t strlen ( const char* str );
计算指定字符串的长度
#define _CRT_SECURE_NO_WARNINGS 1 #include#include int my_strlen(const char* str) { assert(str); int count = 0; while (*str != ' ') { count++; str++; } return count; } int main() { char* str = "abcdef"; printf("%dn", my_strlen(str)); return 0; }
运行结果:



