那么好了好了,宝子们,今天给大家介绍一下strcpy函数及其模拟,还有assert,const与凉皮男孩间的爱恨情仇,来吧,开始整活!⛳️(今天的内容和故事非常的有趣,希望大家一键三连,嘿嘿~)
一、认识strcpy函数
废话不多说,我们直接写代码来实现一下:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>//注意必须要引用头文件
int main()
{
char arr1[] = "hello bit";
char arr2[] = "xxxxxxxxxxxx";//12个
strcpy(arr2, arr1);
printf("%s\n", arr2);
return 0;
}
在这个函数还需要注意一点,它也会将你的终止字符也就是字符串的结束标志\0,也会复制到目的地的数组中,接下来让我们用调试监视窗口来看一下内部是怎么个来龙去脉?
二、模拟实现strcpy函数
版本一:
#include <stdio.h>
#include <string.h>
void my_strcpy(char* destina, char* source)//我们的目的是将arr1中的数组内容复制到arr1中.(目的地:destination 源头:source)
{
while (*source != '\0')
{
*destina = *source;
source++;
destina++;
}
*destina = *source;//不要忘了\0的copy
}
int main()
{
char arr1[] = "hello bit";
char arr2[] = "xxxxxxxxxxxx";//12个
my_strcpy(arr2, arr1);
printf("%s\n", arr2);
return 0;
}
优化2:(+断言)
#include <stdio.h>
#include <assert.h>
void my_strcpy(char* destina, char* source)//我们的目的是将arr1中的数组内容复制到arr1中.(目的地:destination 源头:source)
{
//assert(断言)
assert(destina != NULL);
assert(source != NULL);
while (*source!='\0')//这个地方将\0也复制了进去
{
source++;
destina++;
}
*destina = *source;
}
int main()
{
char arr1[] = "hello bit";
char arr2[] = "xxxxxxxxxxxx";//12个
char* p = arr2;//创建一个指针变量
p = NULL;//这里要将NULL空地址赋给一个指针变量
my_strcpy(p, arr1);
printf("%s\n", arr2);
return 0;
}
assert很高效,当我们期望某一个事情不发生的时候,我们在这里断言一下,如果报错了,他能够准确的告诉你是哪一行再不用,让你再一个一个的去找哪里出了问题
assert其实是一种预判,而且在使用的时候要引用头文件
优化3:
#include <stdio.h>
#include <assert.h>
void my_strcpy(char* destina, char* source)//我们的目的是将arr1中的数组内容复制到arr1中.(目的地:destination 源头:source)
{
//assert(断言)
assert(destina != NULL);
assert(source != NULL);
while (*destina = *source)//这个地方将\0也复制了进去
{
source++;
destina++;
}
}
int main()
{
char arr1[] = "hello bit";
char arr2[] = "xxxxxxxxxxxx";//12个
my_strcpy(arr2, arr1);
printf("%s\n", arr2);
return 0;
}
优化4:
#include <stdio.h>
#include <assert.h>
void my_strcpy(char* destina, char* source)//我们的目的是将arr1中的数组内容复制到arr1中.(目的地:destination 源头:source)
{
//assert(断言)
assert(destina != NULL);
assert(source != NULL);
while (*destina++ = *source++)//这个地方将\0也复制了进去
{
;//空语句:因为必须要写,但有什么也不执行
}
}
int main()
{
char arr1[] = "hello bit";
char arr2[] = "xxxxxxxxxxxx";//12个
my_strcpy(arr2, arr1);
printf("%s\n", arr2);
return 0;
}
优化5:(剖析strcpy库函数)(const)
#include <stdio.h>
#include <assert.h>
char* my_strcpy(char* destina, const char* source)//我们的目的是将arr1中的数组内容复制到arr1中.(目的地:destination 源头:source)
{
//assert(断言)
assert(destina != NULL);
assert(source != NULL);
char* ret = destina;//用来标记最终所复制后的数组的起始位置,以便于后续打印
while (*destina++ = *source++)//这个地方将\0也复制了进去
{
;//空语句:因为必须要写,但有什么也不执行
}
return ret;
}
int main()
{
char arr1[] = "hello bit";
char arr2[] = "xxxxxxxxxxxx";//12个
//my_strcpy(arr2, arr1);
printf("%s\n", my_strcpy(arr2, arr1));
return 0;
}
之前我们学过const修饰的变量,就会具有了常量的属性:
在这里我们有如下结论:
此时此刻,我们假设现在暂时没有const
以上是凉皮男孩的故事,有人看故事,有人照镜子。
这个故事,只是为了娱乐,是为了帮助大家更好的理解const的修饰指针时候的所起的作用效果
帮助大家理解,实际上记住结论就可以。
好了,今天的分享就到这里了
如果对你有帮助,记得点赞👍+关注哦!
我的主页还有其他文章,欢迎学习指点。关注我,让我们一起学习,一起成长吧!