strlen函数:
功能:获取到\0之前的的字符个数。
代码模拟实现函数:
//strlen
//这里用了递归法,
//如abc,1+bc,然后1+1+c,接着1+1+1,最后读取到\0,1+1+1+0,得到结果3。size_t my_strlen(const char* str)
{if (*str == '\0')return 0;elsereturn 1 + my_strlen(str + 1);
}
int main()
{char arr[] = "abc";size_t len = my_strlen(arr);printf("%zd\n", len);return 0;
}
strcpy函数:
功能:拷贝一个指定的字符串
代码模拟实现函数:
//strcpy
char* my_strcpy(char* dest, char* str)
{char* ret = dest;assert(dest && *str);//断言,如果其中有一个为空指针,停止运行,保护程序while (*dest = *str){dest++;str++;}return ret;
}
int main()
{char arr1[20] = { 0 };//被拷入数组char arr2[] = "abcdef";//拷入数组my_strcpy(arr1, arr2);printf("%s\n", arr1);return 0;
}
strcmp函数:
功能:比较两个字符串的对应的ascll码值大小(从左到右对应的ascll码值大小)
代码模拟实现函数:
int my_strcmp(const char* s1, const char* s2)
{while (*s1 == *s2){if (*s1 == '\0')return 0;//读取到\0时仍然相等,说明两个字符串完全一样s1++;s2++;}return *s1 - *s2;
}
int main()
{int ret = my_strcmp("abcdef", "abc");if (ret > 0)printf("大于\n");else if (ret == 0)printf("等于\n");elseprintf("小于\n");return 0;
}
strcat函数:
功能:粘贴两个字符串
代码模拟函数实现:
//strcat
char* my_strcat(char* dest, const char* src)
{char* ret = dest;assert(dest && src);//断言//找到目标空间,也就是第一个字符串的结尾的\0while (*dest){dest++;}//拷贝while (*dest = *src){dest++;src++;}return ret;
}
int main()
{char arr1[20] = "hello ";char arr2[] = "world";my_strcat(arr1, arr2);printf("%s\n", arr1);return 0;
}
strstr函数:
功能:在较长数组1中看是否能找到较短数组2,如果存在,打印数组1中数组2的字符串起始位置到结束
代码模拟函数实现:
//strstr
char* my_strstr(char* str1, char* str2)
{const char* cur = str1;//记录数组1的起始位置const char* s1 = NULL;const char* s2 = NULL;//创建两个空指针,用来模拟数组地址的变化assert(str1 && str2);//断言if (*str2 == '\0'){return (char*)str1;//str2历遍完全部字符了,且符合条件,记录str1的位置}while (*cur)//进入判断条件,建议画图模拟一下,用abbbbcdef和bbc这两个数组能找出所有可能发生的情况{s1 = cur;s2 = str2;while (*s1 == *s2){s1++;s2++;}if (*s2 == '\0'){return (char*)cur;//此时,找到符合位置的地址,返回str1此时历遍到的位置}cur++;}return NULL;//历遍完全部数组,仍没有找到,说明a数组中不存在符合b数组的字符串
}
int main()
{char arr1[]="abcdef";char arr2[] = "bcd";char* ret = my_strstr(arr1, arr2);if (ret != NULL)printf("%s\n", ret);elseprintf("找不到\n");return 0;}