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'

posted @ 2012-01-14 15:41  刺客XIII  阅读(5265)  评论(2编辑  收藏  举报