C++危险的函数 strcpy strncpy

时间:2022-02-21 18:55:13

即使是让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,因而无法知道拷贝了多少个字节。