strcpy与strncpy工作方式及其区别

strcpy中的循环语句:

while ((*strDest++ = *strSrc++) != '\0')

        这个循环会一直执行,直到循环条件为空,即'\0',也就是说,如果strDest所指的存储空间不够大的话,这个函数会将strSrc中的部分内容拷贝到strDest所指内存空间后面的内存中。而strDest所指空间后面的内存却是不可知的,有可能已经被其他资源占用了,这样就会破坏原先存储的内容,导致系统崩溃。


        因为strcpy在执行字符串拷贝的时候,会从strSrc所指位置开始,检测当前内存单元中存储的数据是否为'\0'。如果不为'\0',则将这个内存单元中的数据拷贝到strDest所指向的内存中。如果strSrc中存储的字符串长度大于dst所申请的内存空间的话,就会产生越界,造成不可预知的后果。


strncpy的函数原型:

    char *strncpy(char *dest, const char *src,int count)


函数功能:


    将字符串src中的count个字符拷贝到字符串dest中去。返回指向s1的指针


用法解析:

      这个函数和strcpy类似,当src的长度大于dst申请的空间的时候,情况和strcpy一样;


      如果第3个参数count的值大于src中字符串的长度的话,就会将字符串src拷贝到dst中,返回函数。


   注意:如果源串长度大于n,则strncpy不复制最后的'\0'结束符,所以是不安全的,复制完后需要手动添加字符串的结束符才行。
区别:


第一种情况:

1 char* p="how are you ?";

2 char name[20]="ABCDEFGHIJKLMNOPQRS";


 strcpy(name,p);   //name改变为"how are you ? "     ====>正确!
 strncpy(name,p,sizeof(name))    //name改变为"how are you ?      "       ====>正确!


经过vc验证:两种都是how are you ?


第二种情况:

1 char* p="how are you ?";

2 char name[20];


strcpy(name,p);    //name改变为"how are you ? "     ====>正确!
strncpy(name,p,sizeof(name));        //name改变为"how are you ?      "      ====>正确!


第三种情况:

1 char* p="how are you ?";

2 char name[10];


strcpy(name,p);      //目标长度小于源串===》错误!
strncpy(name,p,sizeof(name));      //源串长度大于指定拷贝的长度sizeof(name),在这种情况下不会自动在目标串后面加'\0' 。


name[sizeof(name)-1]='\0';//和上一步组合,弥补结果


strncpy
如果目标长>指定长>源长,则将源长全部拷贝到目标长,自动加上'/0'
如果指定长<源长,则将源长中按指定长度拷贝到目标字符串,不包括'/0',
如果指定长>目标长,error happen!


 


 总结:


strcpy(),以源串中的'/0'为拷贝结束标志,直到遇到该'\0'为止,然后将'\0'拷贝上.


strncpy()以第三个参数N为拷贝结束标志,如果source的长度小于N,则剩余的字符全部用'\0'填充.


              如果source的长度大于N,则从source中截取前N个字符,拷贝过去.不包括'\0'
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值