人类高质量男性不好当?那就来写人类高质量代码!


前言

众所周知,想要成人类高质量男性是十分不容易的,但这是一个大目标。一口是不能吃成大胖子的,那么我们可以将目标分为一个个小目标,(咳咳)比如先赚他一个亿 ,作为码农,想要成为人类高质量的程序员,那么你写出来的也必须经过优化,使得代码运行的效率更高,那么今天就来教学一波如何写出高质量代码,为你成为人类高质量码农的道路上添砖加瓦!
在这里插入图片描述


一、一个简单的例子(模拟实现strcpy函数)

1.strcpy函数介绍

相信各位都知道strcpy函数,如果不知道的话,建议紫砂谢罪那么我来简单介绍一下函数:
strcpy函数:

  1. 原型声明:char strcpy(char dest, const char *src);
  2. 头文件:#include <string.h> 和 #include <stdio.h>
  3. 功能:把从src地址开始且含有NULL结束符的字符串复制到以dest开始的地址空间
  4. 说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。

2.模拟实现strcpy函数

那么如果我们想要实现一个strcpy函数该怎么做呢?
在这里插入图片描述


代码示例:

#include<stdio.h>
void my_strcpy(char* dest, char* src)
{
	while (*src!='\0')
	{
		*dest = *src;
		*dest++;
		*src++;
	}
	*dest = *src;//将'\0'也赋入arr1,防止出现arr1数组的内容
}
int main()
{
	//定义两个数组
	char arr1[] = "###############";
	char arr2[] = "人类高质量男性";
	my_strcpy(arr1,arr2);
	printf("%s\n", arr1);
}

这里我们定义了两个数组,我们想要将arr2数组拷贝进arr1,那么我们写一个my_strcpy函数。这里使用了传址调用,字符指针dest表示目标地址,字符指针src表示源头地址,使用循环来遍历数组,如果源头地址src不等于0(也就是何时拷贝完毕),将源地址的值赋给目标地址,来达到传值的效果,地址++,一个一个地址的赋值改变。

那么我们就这样完成了一个简单的strcpy函数。

二、高质量(优化)部分

很明显我们刚刚写出来的代码比较低质量,代码还存在许多问题我们没有考虑到,那么我们现在可以如何提高自身代码的质量。

1.对于源头数组的思考

观察代码,我们可以发现数组arr2是不可改变的。那么我们就可以使用const关键字对其进行修饰,来防止它发生变化。防止数据发生变化。那么函数体就可以写为:

char arr2[] = "人类高质量男性";

代码示例:

void my_strcpy(char* dest,const char* src)
{
	while (*src!='\0')
	{
		*dest = *src;
		*dest++;
		*src++;
	}
	*dest = *src;//将'\0'也赋入arr1
}

2.对于循环体的思考

我们很明显可以看出循环体里面的内容是否过于冗余,代码过于臃肿,那么进行优化
代码示例:

void my_strcpy(char* dest,const char* src)
{
	//先赋值再++
	//当遇到'\0'循环结束
    while (*dest++ = *src++)
    {
		;
	}
}

3.对于函数返回值的思考(链式访问)

当我们查看strcpy函数定义时,我们可以发现strcpy其实是有返回值的,但我们这里没有写,那么当打印时发生的链式访问就无法运行。
例如:

printf("%s\n", my_strcpy(arr1, arr2));

此时代码就无法很好的运行。那么可以让函数返回值应该为char*,这样我们的链式访问也能安全进行。我们定义一个指针变量,来储存dest的地址(dest地址会改变,所以ret存储dest初始值),并且返回从而来打印arr1。
代码示例:

char* my_strcpy(char* dest,const char* src)
{
	char* ret = dest;//定义一个指针变量,来储存dest的地址,来打印arr1
	while (*dest++ = *src++)
	{
		;
	}
	return ret;
}
int main()
{
	char arr1[] = "################";
	char arr2[] = "人类高质量男性";
	//把'\0'也打印了
	//如果传递空指针就会崩溃,所以加上断言
	printf("%s\n", my_strcpy(arr1, arr2));//返回值有助于链式访问
}*/

4.对于空指针的思考

如果我们传递了一个空指针怎么办?
那么我们可以使用assert(断言)函数来判断传递的指针是否为空指针,这里就要用到#include<assert.h>头文件了。
使用断言来判断指针是否为空指针,当为空指针时就会报错。
代码如下:

#include<stdio.h>
#include<assert.h>
char* my_strcpy(char* dest,const char* src)
{
	assert(dest != NULL);//断言
	assert(src != NULL);//断言
	char* ret = dest;//定义一个指针变量,来储存dest的地址,来打印arr1
	while (*dest++ = *src++)
	{
		;
	}
	return ret;
}
int main()
{
	char arr1[] = "################";
	char arr2[] = "人类高质量男性";
	printf("%s\n", my_strcpy(arr1, arr2));//返回值有助于链式访问
}

运行:
在这里插入图片描述
当以上问题解决时,我们就写出了较高质量的代码,离人类高质量男性又进了一步!
在这里插入图片描述

总结

当我们写代码时,即使程序运行出来了,我们依旧不能掉以轻心,要多方位思考,不断优化,使得代码更加安全,这样我们就朝着人类高质量男性更进一步。共勉!

#include<stdio.h>
#include<assert.h>
char* my_strcpy(char* dest,const char* src)
{
	assert(dest != NULL);//断言
	assert(src != NULL);//断言
	char* ret = dest;//定义一个指针变量,来储存dest的地址,来打印arr1
	while (*dest++ = *src++)
	{
		;
	}
	return ret;
}
int main()
{
	char arr1[] = "################";
	char arr2[] = "人类高质量男性";
	printf("%s\n", my_strcpy(arr1, arr2));//返回值有助于链式访问
}

作者水平有限,文章若有错误,还望指正,万分感激!

  • 28
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值