《模拟实现字符串函数》(包括strlen,strcpy,strcat,strcmp,strncpy,strncat,strncmp,strstr)

🌹作者:小泽同学~
📝csdn个人主页:小泽同学~
📝码云:classmate-mzq
🤟motto:己所不欲,勿施于人and勿以善小而不为,勿以恶小而为之
————————————————

前言:不出意外的话,我将在这里记录我的大学编程学习。
因为我也是小白,所以如果大家看到问题的话,可以直接在下面评论或者加我v私我,感谢大家!
个人v:m0106gm(添加的话麻烦备注csdn)
祝我们前程似锦

本人使用的开发环境工具是vs2022

1.strlen

  1. 作用:求字符串的长度
    【字符串以\0结尾,用strlen计算字符串长度的时候,\0不算】
  2. 函数原型:size_t strlen ( const char * str );
    【返回类型size_t相当于unsigned即无符号整型(因为字符串长度不可能是负数), 返回的就是字符串的长度;参数是指针类型,被const修饰,因为我们求的是字符串长度,不需要更改字符串,所以用const修饰可以防止传过来的指针被修改】
  3. 头文件:string.h

相关信息参考:strlen


实例:

#include <stdio.h>
#include <string.h>
int main()
{
   
	char* p = "i love you!";
	printf("%d", strlen(p));
	return 0;
}

打印11


模拟实现:

#include <stdio.h>
//返回类型是否写size_t其实都一样,因为count不可能为负数,写size_t的优点就是范围大了一倍而已;
//如果返回类型写size_t,count变量的类型也应该用size_t
int my_strlen(const char* p)
{
   
	int count = 0;  //用来计数
	while (*p!='\0')  //当*P不等于斜杠0
	{
   
		count++;  //count加1
		p++;      //p向后移动一位
	}
	return count;  //返回
}
int main()
{
   
	char* p = "i love you!";
	printf("%d", my_strlen(p));
	return 0;
}

打印11


函数也可以简写成:

//1. *p不等于'\0'就停下,非0为真,所以!='\0'可以直接省略;2. 直接后置++
int my_strlen(const char* p)
{
   
	int count = 0;  
	while (*p++)  
		count++;
	return count;
}

进行优化:
想一下,当我们传进函数的指针为空指针时,会怎么样?

有的编译器会直接报错,有的编译器虽然没有报错但是进行打印时显示器也没有进行打印。为什么?因为空指针是不能进行解引用的!
那如何规避呢?——使用函数assert进行断言

函数assert

  1. 作用:进行断言:判断参数是否为0,如果是则进行报错提醒,如果不是则正常运行(包括0 '\0' NULL)
  2. 函数原型:void assert (int expression);
  3. 头文件:assert.h

相关信息参考:assert
优化代码:

#include <stdio.h>
#include <assert.h>
int my_strlen(const char* p)
{
   
	assert(p);
	int count = 0;
	while (*p++)
		count++;
	return count;
}
int main()
{
   
	char* p = NULL;
	printf("%d", my_strlen(p));
	return 0;
}

p是空指针,用assert进行断言,会有报错提醒
在这里插入图片描述
line 6是第六行的意思,即发生错误的行数,前面的是文件路径
在这里插入图片描述

2.strcpy

  1. 作用:字符串拷贝,将一个字符串的内容拷贝到另一个字符串
  2. 函数原型:char * strcpy ( char * destination, const char * source );
    【返回类型和参数均为指针类型,第一个参数是目标字符串,第二个字符串是源头字符串,即把第二个字符串的内容拷贝到第一个字符串里面去。因为源头字符串不需要改动,所以用const修饰可以防止源头字符串被改动】
  3. 头文件:string.h

相关信息参考:strcpy

//代码1
#include <stdio.h>
#include <string.h>
int main()
{
   
	char arr1[20] = {
    0 }; 
	char arr2[] = "i love you!";
	strcpy(arr1, arr2);  //把arr2的内容拷贝到arr1中
	printf("%s", arr1);  
	return 0;
}

在这里插入图片描述

//代码2
#include <stdio.h>
#include <string.h>
int main()
{
   
	char arr1[] = "i love myself";
	char arr2[] = "i love you!";
	strcpy(arr1, arr2);
	printf("%s", arr1);
	return 0;
}

在这里插入图片描述
arr1的内容比arr2的多,但是拷贝后也只是打印了arr2原本的字符。表明:字符串拷贝的时候,\0也会被一同拷贝

使用strcpy的注意事项:目标字符串的大小一定要比源头字符串的大小大,否则会报错


模拟实现:

#include <stdio.h>
#include <assert.h>
void my_strcpy(char *des,const char* sou)
{
   
	assert(des);//进行断言,判断des和sou是不是空指针
	assert(sou);
//*sou不等于'\0\时,说明sou还没有结束,则进行拷贝
	while (*sou != '\0') 
	{
   
		*des = *sou;  //拷贝
		des++;        //向后移动一位
		sou++;
	}
//因为当*sou!='\0'时结束循环,所以实际上'\0'还并没有进行赋值,所以循环结束后要单独进行赋值
	*des = '\0';  
}

int main()
{
   
	char des[] = "i love you!";
	char sou[] = "love you!";
	my_strcpy(des, sou);
	printf("%s", des);
	return 0;
}

打印:love you!
函数也可以简写成:

//1.直接后置++ ;2. 直接相等,省去循环后还要赋值;3.当*sou='\0'时表达式为0,则停止循环
void my_strcpy(char *des,const char* sou)
{
   
	assert(des);
	assert(sou);
	while (*des++=*sou++)
	{
   
		;
	}
}

代码优化:
strcpy的函数原型为char * strcpy ( char * destination, const char * source )
可以看到是有返回值的,返回我们的目标字符串的地址即目标指针destination
那么可以这么写吗?

#include <assert.h>
char* my_strcpy(char* des, const char* sou)
{
   
	assert(
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小泽同学~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值