strlen函数的模拟实现(计算字符串长度)
1.常规方法实现
int my_strlen1(const char* str)
{
assert(str != NULL);
int count = 0;
while (*str != '\0')
{
count++;
str++;
}
return count;
}
2.递归方法实现
int my_strlen2(const char* str)
{
assert(str != NULL);
int count = 0;
if (*str != '\0')
{
return 1 + my_strlen2(str + 1);
}
else
return 0;
}
3.指针方法实现
int my_strlen3(const char* str)
{
assert(str != NULL);
const char* start = str;
while (*str != '\0')
{
str++;
}
return str - start;
}
主函数如下
int main()
{
char arr[] = "abcde";
int len = my_strlen3(arr);
printf("%d", len);
return 0;
}
效果如下
注意
strlen是求字符串长度的,求出的长度不可能为负数,所以返回类型为size_t,即无符号的整型,所以下图代码的运行结果是>
int main()
{
if (strlen("abc") - strlen("abcdef") > 0)
printf(">\n");
else
printf("<=n");
return 0;
}
strcpy函数的模拟实现(拷贝字符串函数)
char* my_strcpy(char* dest, const char* src)
{
char* ret = dest;
assert(dest && src);
while (*dest++ = *src++)
{
;
}
return ret;
}
主函数如下
int main()
{
char arr1[20] = "";
char arr2[] = "hello world";
my_strcpy(arr1, arr2);//把arr2放到arr1
printf("%s\n", arr1);
return 0;
}
效果如下
注意
源字符串必须以 '\0' 结束
拷贝时会将源字符串中的 '\0' 拷贝到目标空间
目标空间必须足够大,以确保能存放源字符串
目标空间必须可变
strcat函数的模拟实现(在一个字符串后加上字符串)
char* my_strcat(char* dest, const char* src)
{
assert(dest && src);
char* ret = dest;
//1.找目标空间末尾的\0
while (*dest)
{
dest++;
}
//2.追加字符串
while (*dest++ = *src++)
{
;
}
return ret;
}
主函数如下
int main()
{
char arr1[20] = "hello";
char arr2[] = " world";
my_strcat(arr1, arr2);
printf("%s\n", arr1);
return 0;
}
效果如下
注意
源字符串必须以 '\0' 结束
目标空间必须有足够的大,能容纳下源字符串的内容
目标空间必须可修改
strcmp函数的模拟实现(比较两个字符串的大小)
int my_strcmp(const char* str1, const char* str2)
{
assert(str1 && str2);
while (*str1 == *str2)
{
if (*str1 == '\0')
return 0;
str1++;
str2++;
}
if (*str1 > *str2)
return 1;
else
return -1;
}
主函数如下
int main()
{
char arr1[] = "abuisd";
char arr2[] = "abc";
int ret = my_strcmp(arr1, arr2);
printf("%d", ret);
return 0;
}
效果如下
注意
事实上:
如果第一个字符串大于第二个字符串,则返回大于0的数字;
如果第一个字符串等于第二个字符串,则返回0;
如果第一个字符串小于第二个字符串,则返回小于0的数字
strstr函数的模拟实现(字符串查找)
char* my_strstr(const char* str1, const char* str2)
{
assert(str1 && str2);
if (*str2 == '\0')
{
return (char*)str1;
}
const char* s1 = NULL;
const char* s2 = NULL;
const char* cp = str1;
while (*cp)
{
s1 = cp;
s2 = str2;
while (*s1 !='\0' && *s2!='\0' && *s1 == *s2)
{
s1++;
s2++;
}
if (*s2 == '\0')
{
return (char*)cp;
}
cp++;
}
return NULL;
}
主函数如下
int main()
{
char arr1[] = "abbbcdbbcef";
char arr2[] = "bbc";
char* ret = my_strstr(arr1, arr2);
if (ret == NULL)
{
printf("找不到\n");
}
else
{
printf("%s\n", ret);
}
return 0;
}
效果如下
memcpy函数的模拟实现(内存拷贝函数)
void* my_memcpy(void* dest, const 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[10] = { 0 };
my_memcpy(arr2, arr1 + 3, 20);
return 0;
}
效果如下
这是拷贝前的arr2:
这是拷贝后的arr2