《strcpy() 与 strncpy() 》——真假美猴王

💖个人主页:小光死嗑C++
💖**本人介绍:**一名机械生非要找死学计算机,c++爱好者,正在c++道路上探索,愿意拿出一百二十的精力去与C++死磕到底!
💖文章难易程度:本人的文章没有貂蝉那么美,没有吕布那么强,通俗点说,小光的文章并不像那些大牛一样那么神奇,没有那么高深的算法,只是对自己所掌握的内容进行总结、梳理,最后一步一步细细细的写出来。所以不管是入门的小白,还是要复习牛逼的大佬,都是可以非常容易理解的希望各位不要嫌我啰嗦!
结尾:最后说一点,小光的文章可能会有点不一样,只为了主打你在阅读文字繁多的资料时也可以让你开开心心的浏览!


今天,小光又为大家带来了四个龙凤胎函数函数,几个函数非常的酷似,但是,也各有各帅气,各有各的漂亮,现在直接为大家做一个详细的讲解:

发车!!!

💯1.strcpy()

头文件:#include <string.h>

函数功能介绍:strcpy()函数是一个字符串拷贝函数,用来将一个数组中字符串的内容拷贝到另一个另一个数组中。

记住:只是一份拷贝而已,并没有修改原字符串的内容

下面小光先实现一下函数的功能来简单的了解一下!

int main()
{

	char arr[] = "abcdef";
	char copy[20] = { 0 };
	strcpy(copy, arr);//数组名是数组首元素地址
	printf("%s", copy);
}

在这里插入图片描述

就这么进行了乾坤大挪移😁,就是这么so easy!!!同样,想要了解一个函数,必备网站:https://cplusplus.com

在这里插入图片描述

在这里插入图片描述

🔴注意事项一:请看错误代码:

在这里插入图片描述

注意:有些人的就喜欢自创武功,能力不行还偏要勉强,觉得就像上面代码一样,进行一个简单的相互赋值就可以了,那就是打错特错的!语法就是语言的法则,想要拷贝字符串就是用strcpy!

🔴注意事项二:

strcpy()函数具体在拷贝的时候,他是如何知道要拷贝多少个字符?拷贝到那个字符时停止?请看下面代码:

int main()
{

	char arr[] = "abc\0def";
	char copy[20] = "xxxxxxxx";
	strcpy(copy, arr);
	printf("%s", copy);

}

在这里插入图片描述

呀!当我在字符串中间放了一个‘\0’后,经过调试发现,不仅拷贝了abc,同时也将‘\0’也拷贝了过去!

再看另一组测试:

在这里插入图片描述

得出结论:

干货一:

strcpy()在使用的时候,遇见‘\0’就结束拷贝,同时,将‘\0’也拷贝了过去。就像小弟遇见大哥一样,看见就停止了嚣张的步伐😎,当没有遇见\0时,就会一直拷贝!

🔴注意事项三:

在这里插入图片描述

干货二

以上这组代码表示,当往目标空间里面拷贝字符时,一定要注意目标空间足够大,不然就会造成栈溢出,程序崩溃!如果一个程序员能犯下这样的错误,那你就应该被辞退了😂!

🔴注意事项四:

在这里插入图片描述

程序已经崩溃掉!!!,因为p1是一个常量字符串,常量字符串中的内容是不可以以改变的!

干货四

拷贝时必须保证目标空间可变!!!

strcpy()的模拟实现

# include <assert.h>
char* my_strcpy(char* dest, const char* src)
{
	char* ret = dest;//先保存目标空间的起始地址
	assert(dest && src);//断言
	while (*dest++ = *src++)//直到遇见\0停止
	{
		;
	}
	return dest;//返回目标空间的起始地址
}
int main()
{
	char arr1[] = "abcdef";
	char arr2[10] = { 0 };
	my_strcpy(arr2, arr1);
	printf("%s", arr2);
    //第二种打印方法:
    //printf("%s",my_strcpy(arr2,arr1));必须有返回值
	return 0;
}

总结:

1、原字符串必须以‘\0’终止

2、会将源字符串中的\0拷贝到目标空间里去

3、目标空间必须足够大,以确保能存放源字符串。

3、目标空间必须可变

💯2.strncpy()

头文件:include <string.h>

这个函数也是字符串拷贝函数,但是他有一点点点的不一样,就是多了一个字母n,虽说只是多了一个字母,但是也多了一项功能!

先看文件:

在这里插入图片描述
在这里插入图片描述

多了一个size_t num, 表示,把源字符串内容拷贝到目标字符中,多了一项功能就是,你可以给我一个需要拷贝字符的个数,你让我拷贝几个,我就给你拷贝几个!

在这里插入图片描述

🔴注意事项一:

在这里插入图片描述

程序发生了错误,目标空间根本就不够放得下6个字符,当然会造成错误;啦,这一点和strcpy是一样的,目标空间必须足够!当然,如果一个人想写bug,谁也拦不住!

🔴注意事项二:

在这里插入图片描述

当我们要拷贝的字符数量大于了源字符串中的数量时,拷贝完源字符串中内容后,会在后面补加0,直到我们所要求的拷贝数量,就比如,以上代码,我们要拷贝9个字符,但是里面只有6个字符,剩余的3个字符用0来补充!!!

干货

1、拷贝num个字符从源字符串到目标空间

2、如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后面追加0,直到num个

本篇章有什么不满意的地方,希望大家多多在评论区评论!!!💝💝💝

贝9个字符,但是里面只有6个字符,剩余的3个字符用0来补充!!!

干货

1、拷贝num个字符从源字符串到目标空间

2、如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后面追加0,直到num个

本篇章有什么不满意的地方,希望大家多多在评论区评论!!!💝💝💝

  • 9
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值