strcpy与strncpy的区别

我顶 字号:

/*
 //源 <= 目标
 char*p="123456789";
 char name1[12]="aaaaaaaaaaa",
 char name2[12]="bbbbbbbbbbb";

 strcpy(name1,p);  //遇空字符结束,结果追加1个空字符:123456789/0 
 
 strncpy(name2,p,5);  //若n>=源,则不足的部分填充/0,结果:123456789/0/0/0
       //若n<源例如=5,则只拷贝5个字符,结果:12345bbbbbb/0  
 */  

 /*
 //源 > 目标
 char name3[6];   //内存地址:0x0012f420
 char name1[4]="aaa"; //内存地址:0x0012f41c
 char name2[4]="bbb"; //内存地址:0x0012f418
 char*p="12345678";

 strcpy(name1,p);  //发生溢出,数据写到了name3的空间
       //结果:name1:1234,name3:5678/0/?
 
 strncpy(name2,p,2);  //若n>=源例如=10,则大于的部分填充空字符,
       //但是发生溢出,数据覆盖了name1和name3的空间
       //结果:name1:5678,name2:1234,name3:/0/078/0/?
       //若n<源,>目标,例如=6,数据覆盖了name1
       //name1:5634,name2:1234
       //若n=目标,name2:1234
       //若n<目标例如=2,name2:12b/0
*/

 /*
 //源字符串无结束符
 char p[9]={'1','2','3','4','5','6','7','8','9'};
 char p2[9]={'1','2','/0','4','5','6','7','8','9'};
 char name3[12];
 char name1[12]="aaaaaaaaaaa";
 char name2[6]="bbbbb";

 strcpy(name1,p);  //会痴情地苦苦寻找结束符, 
 strncpy(name2,p2,12); //会忠实地拷贝12个,不管是什么
       //拷贝过程中遇到/0,之后都填充/0
 */

 /*
 
 结论:
 1、使用strcpy时一定不能用于无结束符的字符串,因为strcpy依赖/0判断源字符串的结束
 2、使用strncpy注意n值一定要<=源字符串,因为strncpy依赖参数n来控制拷贝源的长度
 3、strcpy 和strncpy 对目标空间都不做溢出检查,应保证大于操作数据
 */

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值