strcpy与strncpy之区别


1、手写strcpy

这是将strSrc中的数据拷贝到以strDest开头的地址里面。内存不能重叠。

char * strcpy(char *strDest,char * strSrc)

  assert(strDest!=NULL&strSrc!=NULL);  ///这里,主要这是NULL,不要写0,那样会发生隐士转换的

 char * strtem=strDest;

while((*strDest++=*strSrc++)!='\0');  ///符号优先级你真的明白吗?   ///注意优先级,*比++优先级高。所以如果是i++<n这个条件不满足退出的,但是上一步已经执行了*dest++。

return strtem;

}

左++ > * > 右++

 

想一下,为什么直接拷贝到strDset中,为什么还要返回char*型呢?为了实现链表表达式。比如这样调用int length=strlen(strcpy( strDest, “hello world”));

如果不像上面那样定义,直接返回void型,则需要这样strcpy(strDest, “hello world”));int length=strlen(strDest);

 

 

strncpy相比strcpy,多了一个count的判断,即使未遇到原串的'\0',但是达到了count,也停止复制。

这是源码!!!

char * __cdecl strncpy ( char * dest, constchar * source, size_t count )

{

char *start = dest;

while (count && (*dest++ = *source++)) /* copy string */   

count--;

if (count) /* pad out with zeroes */

while (--count)

*dest++ ='\0';

return(start);

}

 

 

例子:

char* p = "how are you ?";

char name[20] = "ABCDEFGHIJKLMNOPQRS";

strcpy(name, p);
//name改变为"how are you ?"====>正确!

strncpy(name, p, sizeof(name));
//name改变为"how are you ?" =====>正确!后续的字符将置为NULL.

 

 

但是也是不安全的,c++中使用strcpy_s  

char a[]="123456";
cout<<strlen(a)<<endl;      ///6
cout<<sizeof(a)<<endl;    ////7
 

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM