C++危险的函数 strcpy strncpy

2 篇文章 0 订阅
2 篇文章 0 订阅

即使是让C的创始人来编程,也可能出现把==写成=的错误。好的习惯是避免错误的最好方法。

1.strcpy

函数原型为char *strcpy(char *dest,const char *src);

函数说明:strcpy函数会将参数src字符串拷贝至参数dest所指的地址。

参数说明:dest,我们说的出参,最终得到的字符串。src,入参,因为其有const修饰。表示在此函数中不会也不能修改src的值。

返回值:返回dest字符串的起始地址。

附加说明:如果参数dest所指的内存空间不够大,可能会造成缓冲溢出的错误情况。

特别强调:此函数很好用,可是它也很危险。如果在用的时候加上相关的长度判断,则会大大降低出此错误的危险。此函数还有一个特点,就是它在把字符串b拷贝到字符串a的时候,会在拷贝的a字符串的末尾加上一个\0结束标志。这个不同于strncpy()函数。

例如:

#include<string.h>

main(){

    char a[30]="string(1)";

    char b[]="string(2)";

     printf("before strcpy():%s\n",a);

     if(strlen(b)<strlen(a)){

           printf("after strcpy():%s\n",strcpy(a,b));

          }

}

2.strncpy

函数原型为:char *strncpy(char *dest,const char *src ,size_t n);

函数说明:strncpy会将参数src字符串拷贝前n个字符至参数dest所指的地址。

返回值:返回参数dest的字符串起始地址。

特别强调:不要以为这个函数是个好东西,往往在定位问题时,它是罪魁祸首,到顶了,它是静态的容值函数,程序跑起来你就等着dbug吧。

strncpy的正确用法:

strncpy(dest, src, sizeof(dest));
dest[sizeof(dest)-1] = ‘\0’;

  1. size一定要用sizeof(dest)或sizeof(dest)-1,不可误用sizeof(src).
  2. 手工填0. 务必要把dest的最后一个字节手工设置为0. 因为strncpy仅在src的长度小于dest时,对剩余的字节填0.
  3. 性能问题。当dest长度远大于src时,由于strncpy会对多余的每个字节填0,会有很大的性能损失。
  4. 返回值。strncpy返回dest,因而无法知道拷贝了多少个字节。

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值