FUWangsLaw 2018-04-17
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