1.模拟实现strlen
其声明:size_t strlen(const char*str)
(1)字符串以'’作为结束标志,strlen函数返回的是在字符串中''前面出现的字符个数(不包含'')
(2)参数指向的字符串必须以''结束
(3)函数返回值是size_t是无符号整数
实现的代码如下:
#includeint my_strlen(const char* str) { int count = 0; while (*str) { count++; str++; } return count; } int main() { char arr[] = "abcdef"; int len=my_strlen(arr); printf("%dn", len); return 0; }
2.模拟实现strcpy
其声明char*strcpy(char*dest,const char*soure)
(1)源字符串必须以'’结束
(2)会将源字符串中的'',拷贝到目标空间
(3)目标空间必须足够大,以确保能存放源字符串
(4)目标空间必须可变
实现代码如下:
#includevoid my_strcpy(char* s1,const char* s2) { while (*s1++ = *s2++) { } } int main() { char s1[20] = { 0 }; char s2[] = "abcdef"; my_strcpy(s1, s2); printf("%s", s1); return 0; }
3.模拟实现strcmp
其声明int strcmp(const char*str1,const char*str2)
标椎规定:(1)str1大于str2返回大于0的数
(2)str1==str2返回0
(3)str1小于str2返回小于0的数
代码如下:
int my_strcmp(const char* src, const char* dst) { int ret = 0; assert(src && dst); while (!(ret = *(unsigned char*)src - *(unsigned char*)dst) && *dst) { src++; dst++; } if (ret > 0) return 1; else if (ret < 0) return -1; return ret; } int main() { char s1[] = "abcdef"; char s2[] = "cdefab"; int ret=my_strcmp(s1, s2); if (ret > 0) printf("s1>s2"); else if (ret == 0) printf("s1=s2"); else printf("s14.模拟实现strcat
其声明char*strcat(char*dest,const char*soure)
(1)源字符串必须以''结束
(2)目标空间必须足够大,能容纳下源字符串的内容
(3)目标空间必须修改
(4)不能自己给自己追加
代码如下:
#include#include char* my_strcat( char* s1,const char* s2) { char* ret = s1; assert(s1 && s2); while (*s1) { s1++; } while (*s1++ = *s2++) { ; } return ret; } int main() { char s1[20] = "abcdef"; char s2[] = "ghijk"; my_strcat(s1, s2); printf("%sn", s1); return 0; }
5.模拟实现strstr其声明char*strstr(const char*s1,const char*s2)
代码如下:
//#include//#include char* my_strstr(const char* str1,const char*str2 ) { assert(str1 && str2); char* s1 = str1; char* s2 = str2; char* cur = str1; if (!*str2) return str1; while (*s1&&*s2) { s1 = cur; s2 = str2; while (*s1==*s2&&*s1 && *s2) { s1++; s2++; } if (*s2 == ''); return cur; cur++; } return NULL; } int main() { char s1[] = "abcdef"; char s2[] = "abcd"; char* ret = my_strstr(s1, s2); if (ret !=NULL) printf("yesn"); else printf("non"); return 0; } 6.模拟实现memcpy
其声明void*memcpy(void*dest,const void*source,size_t num)
(1)函数memcpy从source的位置开始向后复制num个字节的数到dest的内存位置
(2)这个函数在遇到''的时候并不会停下来
(3)如果source和dest有任何重叠的地方,复制结果都是为定义
在一些编译器中memcpy处理不了内存重叠的情况
代码如下:
#include#include void* my_memcpy(void* dest, void* src, size_t num) { void* ret = dest; assert(dest && src); while (num--) { *(char*)dest = *(char*)src; ++(char*)dest; ++(char*)src; } return ret; } int main() { int arr1[] = { 1,2,3,4,5,6,7,8,9,10 }; int arr2[] = { 5,4,3,2,1 }; my_memcpy(arr1,arr2,5*sizeof(int)); for (int i = 0; i < 10; i++) { printf("%d ", arr1[i]); } return 0; } 7.模拟实现memmove
其声明void*memmove(void*dest,const void*source,size_t num)
如果源空间和目标空间重叠就用memmove处理
代码如下:
#include#include void* my_memmove(void* dest, void* src, size_t count) { void* ret = dest; assert(dest && src); if (dest < src) { while (count--) { *(char*)dest = *(char*)src; ++(char*)dest; ++(char*)src; } } else { while (count--) { *((char*)dest + count) = *((char*)src + count); } } return ret; } int main() { int arr[] = { 1,2,3,4,5,6,7,8,9,10 }; my_memmove(arr + 2, arr, 5*sizeof(int)); for (int i = 0; i < 10; i++) { printf("%d ", arr[i]); } return 0; } 作者实属初学,写博客也是作者学习的一个过程,难免文章中有内容理解不到位或者有不当之处,还请朋友们不吝指正,评论留下各自的见解,相互讨论。希望大家多多给予支持,赠人玫瑰,手有余香!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)