字符串函数的模拟实现

strlen  函数

size_t strlen(const char * str)  求字符串长度的函数,统计\0之前字符个数,结束标志是\0,返回值是size_t 类型

if(strlen("abc")-strlen("abcde"))

模拟实现strlen

方法1

#include<assert.h>
#include<stdio.h>

size_t my_strlen(const char*str)//const修饰,str所指对象不可改
{
int count =0;//计数器,记录字符串长度
assert(str!=NULL);
while(*str!='\0')
{
count++;
str++;
}
return count;
}
int main()
{
char arr[]="abcdef";
size_t len=my_strlen(arr);
printf("%zd\n",len);
return 0;
}

方法2,指针减去指针的方式

#include<assert.h>
#include<stdio.h>

size_t my_strlen(const char*str)//const修饰,str所指对象的内容不可改
{
const char* start=str;
while(*str!='\0')
{
str++;
}
return str-start;
}
int main()
{
char arr[]="abcdef";
size_t len=my_strlen(arr);
printf("%zd\n",len);
return 0;
}

方法3,使用递归,模拟实现时没有使用临时变量

my_strlen("abcde\0") 

1+my_strlen("bcde\0")

...........

1+1+1+1+1+my_strlen("e\0")

1+1+1+1+1+1+my_strlen("\0")

#include<assert.h>
#include<stdio.h>

size_t my_strlen(const char*str)
{
if(*str!='\0')
return 1+my_strlen(str+1);
else
return 0;
}

}
int main()
{
char arr[]="abcdef";
size_t len=my_strlen(arr);
printf("%zd\n",len);
return 0;
}

 strcpy 函数

char* strcpy(char* destination,const char* source) ; source所指字符串内容拷贝到destination所指空间中,包含'\0',(并且是遇到\0才停下来)所以这就要求原字符串中必须有\0,并且目标空间要足够大,能放得下拷贝进来的数据,不然会造成越界访问,并且要求目标空间可修改,

模拟实现

my_strcpy(char*dest,char* src)
{
//拷贝的都是\0前的字符
while(*src!='\0')
{
*dest=*src;
src++;
dest++;
}
//拷贝\0
*dest=*src;
}

int main()
{
char arr1[]="abcdef";
char arr2[20]={0};
my_strcpy(arr2,arr1);
printf("%s\n",arr2);
return 0;
}

 方法2,优化了指针的有效性,避免了\0的单独考虑

char * my_strcpy(char*dest,const char* src)//b保证源空间内容不被意外修改
{
char*ret=dest;
assert(dest&&src)//保证指针的有效性
while(*dest++=*src++;)
//拷贝的一个字符a时,由于是赋值语句,赋值表达式返回值为被拷贝字符的ASCII码值,循环继续,当结束
//时,拷贝到\0,返回值为'\0'的ASCII码值,为0,假,不在进行循环,并且保证\0也被烤进
{
;
}
return ret;//返回目标空间地址,方便观察
}

int main()
{
char arr1[]="abcdef";
char arr2[20]={0};
my_strcpy(arr2,arr1);
printf("%s\n",arr2);
return 0;
}

strcat 字符串追加函数

char *strcat(char*des,char*src)

目标空间中得有\0,(从哪里开始),源头字符串中得有\0(追加到什么时候结束)

目标空间得足够大。

模拟实现

char*my_strcat(char*dest,const char* src)
{
char*ret=dest;//用于返回
assert(dest&&crc);
//1.找到目标空间的\0
while(*dest!='\0')
{
dest++;
}
//2.拷贝
while(*dest++=*src++;)
{
     ;
}
return ret;
}


int main()
{
char arr1[20]="hello";
char *p="world";
strcat(arr1,"world");
printf("%s\n",arr1);
return 0;
]

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值