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