strlen模拟实现
重点:1.字符串已经'\0'作为结束标志,strlen返回的是字符串'\0'前面出现的字符个数(不包含'\0')
2.参数指向的字符串必须要以'\0'结束。
3.注意函数的返回值是size_t,是无符号的,加减是无法对比的。
模拟:
cs
size_t my_strlen(const char* arr)
{
size_t num = 0;
while (*(arr++) != '\0')
{
num++;
}
return num;
}
int main()
{
char arr[] = "abcdef";
printf("%zd\n", my_strlen(arr));
}
strcpy模拟实现
重点:1.源字符串必须以'\0'结束
2.函数会将源字符串中的'\0'拷贝到目标空间
3.目标空间必须足够大,以确保能存放源字符串
4.目标空间必须可变
模拟:
cs
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[] = "abcdef";
printf("%s\n", my_strcpy(arr1, arr2));
}
strcat模拟实现
重点:1.源字符串必须以'\0'结束
2.目标空间必须足够大,能容纳源字符串的内容
3.目标空间必须可以修改
4.目标空间必须有'\0',函数找到'\0'开始追加
5.字符串不可以自己给自己追加,尽量不要。
模拟:
cs
char* my_strcat(char* dest, const char* src)
{
assert(dest && src);//断言
char* ret = dest;
/*while (*dest++)
{
;
}*///为什么不这么写,因为dest就不会在'\0'上了会在'\0'后面一位
while (*dest)
{
dest++;
}
while ((*dest++ = *src++))
{
;
}
return ret;
}
int main()
{
char arr1[20] = "abcd";
char arr2[] = "ef";
printf("%s\n", my_strcat(arr1, arr2));
}
strcmp模拟实现
重点:1.
2.比较对于位置上字符的大小(ASCLL值),不是长度。
模拟:
cs
int my_strcmp(const char* str1, const char* str2)
{
assert(str1 && str2);
while (*str1 == *str2)
{
if (*str1 == '\0')
{
return 0;//要相等代表两个字符串长度和对应的字符都一模一样
}
str1++;
str2++;
}
return *str1 - *str2;
}
int main()
{
char arr1[] = "abcd";
char arr2[] = "abce";
if (my_strcmp(arr1, arr2) > 0)
{
printf(">\n");
}
else if (my_strcmp(arr1, arr2) == 0)
{
printf("==\n");
}
else
{
printf("<\n");
}
}
strstr模拟实现
模拟:
cs
#include<stdio.h>
#include<assert.h>
//strstr函数模拟,在字符串中找字符串函数
char* my_strstr(const char* arr1,const char* arr2)
{
assert(arr1 && arr2);
char* cp = arr1;//记录起点
char* s1 = arr1;//遍历的指针
char* s2 = arr2;
if (!*s2)//如果源字符串什么都没有直接返回目标字符串
{
return arr1;
}
while (*cp++)
{
s1 = cp;
s2 = arr2;
while ((*s1 == *s2) && *s1 && *s2)//'\0'停下
{
s1++;
s2++;
}
if (!*s2)
{
return cp;
}
}//其实这里还可以再简洁一点
return NULL;
}
int main()
{
char arr1[] = "abbcdef";
char arr2[] = "bbc";
printf("%s\n", my_strstr(arr1, arr2));
}
补充:strstr函数模拟实现还有一种 KMP算法更适合,上面的这种写法还可以再修改,大家可以自己想想。