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
 

 

原文链接: https://www.cnblogs.com/mark-coding/p/8870253.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    strcpy与strncpy之区别

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/272517

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月14日 下午10:48
下一篇 2023年2月14日 下午10:48

相关推荐