strcpy的实现
函数功能:将一个字符数组中的字符串内容复制到另一个字符数组中
注:自己模拟实现的函数名字不要和库函数相同
- 首先要改变两个数组的内容,我们采用址传递的形式,在函数的形参中定义两个char类型指针变量接收传过来的数组地址
char* my_strcpy(char* Str_treget, const char* Str_souce)//函数的声明
这里返回类型定义成char*主要是库函数返回的就是目标数组的首元素地址,我们既然模拟实现库函数,就和库函数保持一致就好,如果你非要定义void类型或者其他类型也可以,反正是代码你写的。
2. 然后我们开始设计函数的内部实现
char* my_strcpy(char* Str_treget, const char* Str_souce)
{
char* ret = Str_treget;
assert(Str_treget != NULL);
assert(Str_souce != NULL);//判断传过来的指针是否是空指针
while (*Str_souce != '\0')//字符串结束标志是'\0',当拷贝到'\0'就结束循环
{
*Str_treget = *Str_souce;
Str_treget++;
Str_souce++; //因为Str_treget存的是首元素地址,每加一都会往后访问一个字符
}
*Str_treget = *Str_souce;//我们拷贝的是整个字符串,那么字符串的结束标志'\0'当然也要拷贝进去
return ret;
}
其实这个代码while循环里面我们还可以优化
while (*Str_treget++ = *Str_souce++)
{ //这里的判断条件巧妙的利用了'\0'的ascll码值是0,即当*Str_treget把'\0'拷进去后,判断条件就会变成0,循环结束
}
优化后的完整代码如下:
char* my_strcpy(char* Str_treget, const char* Str_souce)
{
char* ret = Str_treget;
assert(Str_treget != NULL);
assert(Str_souce != NULL);
while (*Str_treget++ = *Str_souce++)
{
}
return ret;
}
int main()
{
char arr1[] = "hahaha";
char arr2[10];
my_strcpy(arr2, arr1);
printf("%s", arr2);
return 0;
}
strlen的实现
函数功能:计算一个字符串的长度
因为好多地方和上边strcpy一样,所以我们直接上代码,只对个别地方进行说明
int my_strlen(const char* str)
{
assert(str != NULL);
char* p = str;
while (*str++) //判断条件和上边strcpy的判断条件相同,都是循环到字符串结束标志'\0'.
{
}
return str-1 - p;//计算字符串字符个数我们用字符串末地址减去首地址即是中间元素个数
} //str-1的这个一主要是把'\0'减去
int main()
{
char str[] = "gfdgsfsfs";
printf("%d\n", my_strlen(str));
return 0;
}
其实strlen这个库函数的返回类型是size_t,那我们为什么用int呢,我们先来看一个代码

这里为什么打印的是哈哈,不是hehe呢?3-6难道不是-3吗?其实size_t是一个无符号的整形,所以无符号3减去一个无符号6得出来的结果一定是一个无符号整形并且远远大于0的,我们可以写一个小代码验证一下

这个时候我们如果返回值用int就可以完美解决这个问题。那库函数为什么要用size_t呢,其实也是有原因的,因为这是一个计算字符串长度的函数,结果出来的是字符串长度肯定是一个正数,所以系统的库函数才会使用size_t来表示。各有各的长处,只是用处不一样,所以需求也不一样。
#####上边的函数形参中变量类型前的const 主要是为了防止在函数内部出现意想不到的错误把源字符串的内容进行修改,所以我们用const修饰一下,增加了程序的健壮性。
C语言字符串操作
本文深入讲解C语言中字符串处理函数的实现,包括自定义strcpy和strlen函数,详细解析了字符串复制和长度计算的过程,强调了代码优化和健壮性的提升。
4400

被折叠的 条评论
为什么被折叠?



