前言
今天恒川带给大家的是平常应用的库函数,恒川来给大家都模拟实现一下,希望对大家有帮助!!
各大常用库函数的模拟实现
- 1. 模拟实现strlen
- 2. 模拟实现strcpy
- 3. 模拟实现strcat
- 4. 模拟实现strstr
- 5. 模拟实现strcmp
- 6. 模拟实现memcpy
- 7. 模拟实现memmove
1. 模拟实现strlen
三种方式:
方式1:
//计数器方式int my_strlen(const char* str){int count = 0;while (*str){count++;str++;}return count;}int main(){int len = my_strlen("abcdef");printf("%d\n", len);return 0;}
方式2:
//不能创建临时变量计数器//递归int my_strlen(const char* str){if (*str == '\0')return 0;elsereturn 1 + my_strlen(str + 1);}int main(){int len = my_strlen("abcdef");printf("%d\n", len);return 0;}
方式3:
//指针-指针的方式int my_strlen(char* str){char* start = str;while (*str != '\0')str++;return str - start;//指针-指针得到的是元素个数}int main(){int len = my_strlen("abcdef");printf("%d\n", len);return 0;}
2. 模拟实现strcpy
参考代码:
//1.参数顺序//2.函数的功能,停止条件//3.assert//4.const修饰指针//5.函数返回值//6.题目出自《高质量C/C++编程》书籍最后的试题部分char* my_strcpy(char* dest, const char* src){char* ret = dest;assert(dest != NULL);assert(src != NULL);while ((*dest++ = *src++)){;}return ret;}
3. 模拟实现strcat
参考代码:
char* my_strcat(char* dest, const char* src){char* ret = dest;assert(dest != NULL);assert(src != NULL);while (*dest){dest++;}while ((*dest++ = *src++)){;}return ret;}
4. 模拟实现strstr
char* strstr(const char* str1, const char* str2){char* cp = (char*)str1;char* s1, * s2;if (!*str2)return((char*)str1);while (*cp){s1 = cp;s2 = (char*)str2;while (*s1 && *s2 && !(*s1 - *s2))s1++, s2++;if (!*s2)return(cp);cp++;}return(NULL);}
5. 模拟实现strcmp
参考代码:
int my_strcmp(const char* src, const char* dst){int ret = 0;assert(src != NULL);assert(dest != NULL);while (!(ret = *(unsigned char*)src - *(unsigned char*)dst) && *dst)++src, ++dst;if (ret < 0)ret = -1;else if (ret > 0)ret = 1;return(ret);}
6. 模拟实现memcpy
参考代码:
void* memcpy(void* dst, const void* src, size_t count){void* ret = dst;assert(dst);assert(src); /** copy from lower addresses to higher addresses*/while (count--) {*(char*)dst = *(char*)src;dst = (char*)dst + 1;src = (char*)src + 1;}return(ret);}
7. 模拟实现memmove
参考代码:
void* memmove(void* dst, const void* src, size_t count){void* ret = dst;if (dst <= src || (char*)dst >= ((char*)src + count)) { /** Non-Overlapping Buffers** copy from lower addresses to higher addresses */while (count--) {*(char*)dst = *(char*)src;dst = (char*)dst + 1;src = (char*)src + 1;}}else { /** Overlapping Buffers* copy from higher addresses to lower addresses*/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);}
如果这份博客对大家有帮助,希望各位给恒川一个免费的点赞作为鼓励,并评论收藏一下,谢谢大家!!!
制作不易,如果大家有什么疑问或给恒川的意见,欢迎评论区留言。