c语言|C语言中库函数的模拟实现

strcpy 字符串的复制(拷贝),并且将源字符串中的“\0”拷贝进去。

/*strcpy的模拟实现*/ char* my_strcpy(char* des, char* src) { char* ret = des; assert(des != NULL); assert(src != NULL); while ((*des++ = *src++)) { ; } return ret; }

strlen 字符串将“\0”作为结束标志,strlen函数返回值的是在字符串中“\0”前面出现的字符个数(不包含“\0”),返回值为size_t。
/*strlen的模拟实现*/ //方法一:计数器实现方式 int my_strlen(const char* str) { int count = 0; while (*str) { count++; str++; } return count; } //方式二:不创建临时变量count,采用递归 int my_strlen(const char* str) { if (*str == '\0') return 0; else { return 1 + my_strlen(str + 1); } } //方式三:指针减指针的方式 int my_strlen(char* s) { char* p = s; while (*p != '\0') { p++; } return p - s; }

strstr strstr是C语言中的函数,作用是返回字符串中首次出现子串的地址。
/*strstr模拟实现*/ char* my_strstr(const char* str1, const char* str2)//因为返回的是地址 { assert(str1&&str2); if (*str1||*str2) { return NULL; } char* cp = (char*)str1; while (*cp) { char* p1 = (char*)str1; char* p2 = (char*)str2; while (*p1&&*p2 && (*p1 == *p2)) { p1++; p2++; } if (*p2 == '\0') { return cp; } cp++; } return NULL; } //char *strstr(const char *str1, const char *str2) { // char *cp = (char *)str1; // char *s1, *s2; // if (!*str2) //return ((char *)str1); // while (*cp) { ////回溯算法 //s1 = cp; //将s1回到cp的起始位置 //s2 = (char *)str2; //将s2回到str2的起始位置 //while (*s1 && *s2 && !(*s1 - *s2)) //s1++, s2++; //if (!*s2) //return (cp); //cp++; // } // return NULL; //}

memcpy 函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置。
这个函数在遇到“\0”的时候不会停止下来。
/*memcpy模拟实现*/ //因为memcpy函数在实现的时候,不知道未来会被用来拷贝什么类型的函数,所以用void*用来接收 void* my_memcpy(void* des, const void* src, size_t count) { assert(des&&src); void* ret = des; while (count--) { *(char*)des = *(char*)src; des = (char*)des + 1; src = https://www.it610.com/article/(char*)src + 1; } return ret; }

memmove 支持重叠拷贝
/*memmove 模拟实现*/ void* my_memmove(void* dest,const void* src,size_t count) { void* ret = dest; assert(dest&&src); if (dest < src) { //从前-》后拷贝 while (count--) { *(char*)dest = *(char*)src; dest = (char*)dest + 1; src = https://www.it610.com/article/(char*)src + 1; } } else { //从后向前 while (count--) { *((char*)dest + count) = *((char*)src + count); } } return ret; }

strcmp 第一个字符串大于第二个字符串,则返回大于0的数字
第一个字符串等于第二个字符串,则返回0
第一个字符串小于第二个字符串,则返回小于0的数字
int my_strcmp(const char* dest, const char* src) { int ret = 0; assert(dest&&src); while ((ret = *(unsigned char*)src - *(unsigned char*)dest) && *dest) ++src, ++dest; if (ret < 0) ret = -1; if (ret>0) ret = 1; return ret; }

strcat 【c语言|C语言中库函数的模拟实现】字符串追加
要求:
源字符串必须以“\0”结束
目标空间必须足够的大,能容纳下字符串的内容
目标空间必须可修改
char* my_strcat(char* dest, const char*src) { assert(dest&&src); char* ret = dest; //找到目标空间的“\0” while (*dest) { ++dest; } //追加 while ((*dest++) = (*src++)) { ; } return ret; }

    推荐阅读