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

相关推荐