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