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
