assert断言与const修饰指针的妙用(模拟实现strcpy函数)

assert断言

目录

assert断言的妙用:

头文件:

使用方法:

const修饰指针的妙用

主要用法

const在*左边

const在*右边

断言和const修饰指针的应用

模拟实现C语言strcpy函数

1、若字符串str1,str2有空指针怎么办?

2.str2改变了怎么办?


assert断言的妙用:

头文件:

#include <assert.h>

使用方法:

当我们不希望某件事情发生,直接就将该事件的判断语句放在assert()的括号内部,如果判断为真,没有发生,则代码正常运行;如果判断为假,那么直接终止程序,并且报错,assert断言的好处还在于报错时能够精准定位到哪一行出现了问题,所以程序员看到assert断言还是非常亲切的。

const修饰指针的妙用

主要用法

++按照const在*左边,在*右边,可以分为两大类。++

const在*左边

限制的是指针指向的内容,不能通过指针变量改变指针指向的内容,但是指针变量本身是可以改变的

比如指针p指向的内容不可以改变,但是指针p本身是谁的地址是可以改变的

const在*右边

限制的是指针变量本身,指针变量本身是不能改变的,但是指针指向的内容是可以改变的。

比如指针p指向的内容是可以改为20的,但是指针p本身不能改变原有的指向地址a。

灵魂总结:

左定值,右定向

断言和const修饰指针的应用

讲了这么多关于断言和const修饰指针的知识,那就让我们来实践一下

模拟实现C语言strcpy函数

我们已知函数的参数有两个,将后面的字符串内容拷贝到前面去,然后返回目标空间的起始地址

初始代码:

cpp 复制代码
//模拟实现strcpy函数

char* my_strcpy(char* str1, char* str2)
{
	char* ret = str1;
	while (*str1++ = *str2++)
		;
	return ret;
}

int main()
{
	char arr1[20] = "*****************";
	char arr2[] = "i love jing";
	//strcpy(arr1, arr2);
	my_strcpy(arr1, arr2);
	printf("%s\n", arr1);
	printf("%s\n", my_strcpy(arr1,arr2));
	return 0;
}

上面的代码初步实现了strcpy函数,但仍然有很多细节需要注意。

若字符串str1,str2有空指针怎么办?

以防出现上述情况,我们可以使用断言判断这两个字符串不能为空

2.str2改变了怎么办?

可以看出,在设定这个函数时,就已经考虑到被拷贝的字符串的内容不能改变,所以就需要const来修饰指针,并且在*的左边,使得指针指向的内容不会更改。

cpp 复制代码
//模拟实现strcpy函数
#include<assert.h>
char* my_strcpy(char* str1,const char* str2)//const修饰被拷贝的字符串
{
	assert(str1 != NULL);//断言判断
	assert(str2 != NULL);//断言判断
	char* ret = str1;
	while (*str1++ = *str2++)
		;
	return ret;
}

int main()
{
	char arr1[20] = "*****************";
	char arr2[] = "i love jing";
	//strcpy(arr1, arr2);
	my_strcpy(arr1, arr2);
	printf("%s\n", arr1);
	printf("%s\n", my_strcpy(arr1,arr2));
	return 0;
}

上面的代码才是最终解!

相关推荐
xiaobobo33303 小时前
c语言中for循环条件中定义临时栈变量的作用域
c语言·for循环条件定义栈变量·大括号作用域·独立栈变量
惜离殇4 小时前
从零开始的敲代码生活--Linux应用软件(文件操作基础1)
linux·c语言·文件操作·标准io
潘潘的嵌入式日记6 小时前
I²C 从机接收总被覆盖?双缓冲要在 STOP 时交接
c语言·开发语言·单片机
xx~t7 小时前
嵌入式——Linux软件编程——网络1
linux·c语言·网络·vscode·网络协议
羚尔11 小时前
C语言数组
c语言·开发语言
老当益壮梁奶奶14 小时前
Linux软件编程学习笔记(十一):深入浅出 TCP 协议与 Socket 编程实践
linux·c语言·笔记·学习·tcp/ip
Navigator_Z15 小时前
LeetCode //C - 1223. Dice Roll Simulation
c语言·算法·leetcode
Patrick在香港15 小时前
Python 拉取 C&SD 官方 API:香港 2022 年已跨过“超老龄线“,而抚养比正在爬回 1961
android·c语言·python·数据分析·时序数据库·数据可视化·香港
彷徨而立17 小时前
【C/C++】多线程读写普通 int 变量的一些问题(二)
c语言·c++
luj_176817 小时前
毒素驱动的生物自毁机制探析
服务器·c语言·开发语言·经验分享·算法