10.2.4 strcpy函数

cpy即copy,所以这个strcpy函数做的事情是把第二个参数所表达的那个字符串的内容拷贝到第一个参数所表达的目的区域里去.即

这个时候当然是不重叠的.像

这种时候就不能用我们的strcpy来进行拷贝.因为src和dst是重叠的内存区域,strcpy直接从源复制数据到目标,可能会在复制过程中破坏源数据.这样的后果是数据被破坏,导致未定义行为,性能下降等等.另外这个函数要小心的一点是,它第一个参数表示的目标区域,而第二个参数表达的是源.按照我们中国人的思维,我们说把a拷贝到b,一般都会先写a再写b,但是这个函数就反过来了.

然后我们这个函数还有一个返回.我们通常就觉得,这东西就不需要返回了是吧,毕竟我们就做一件事情.可是它会返回那个dst.因为它需要用这种方式让strcpy的结果能够再参与其它的运算.

我们拿strcpy经常要做的一件事情是复制一个字符串,比如说我们从函数的参数,得到了一个字符串,但我们实际上得到的是什么,是个指针.它指向外面的某个地方的一个字符串,那个字符串不是我这里的,我不能保证那个字符串始终有始终在,所以也许我需要把它赋值到我这里.

比较容易出错的地方是忘了加上1,因为我们的编译器只会帮我们数肉眼可见的字符的数量,而不会加上结尾的那个0.我们来试一下做自己的mycpy:

因为我们发现while的条件是不等于0,所以我们可以直接把后面这段去掉.变成while(src[idx]).这是数组版本,那指针版本呢?

我们最后不能return这个dst了,因为它已经被我们+到不知道哪去了,早已经不在原来的位置了.所以我们可以在一开始定义一个指针ret等于dst,最后再return ret.(上面不小心写成了rest.)当然,这个指针版本就很有意思了.我们可以稍微做些修改:

我们做的事情是,先然后把循环体后面!=那部分删掉,然后把循环体的三条语句合并成一条语句,最后我们发现,循环体的这条语句实际上是在做赋值操作,所以我们可以直接拿到while里面做条件,当*src=0时会停止循环.

当然,这么做没有别的意思,就是看起来很简洁.其实可读性不如上面那段代码.只是我们通过这个函数说,哦,c语言可以把代码写成这样子.哇,这个while循环啥都没有了.其实你写成这样子和我们最开始的那个指针版本编译器产生的最终代码和运行效率是一样的.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值