strncpy 和strcpy的區別

2021-08-21 08:11:38 字數 1272 閱讀 7009

1. strcpy函式:顧名思義字串複製函式:原型:extern char *strcpy(char *dest,char *src); 功能:把從src位址開始且含有null結束符的字串賦值到以dest開始的位址空間,返回dest(位址中儲存的為複製後的新值)。要求:src和dest所指記憶體區域不可以重疊且dest必須有足夠的空間來容納src的字串。

一般函式原型實現方式:

char * strcpy(char * strdest,const char * strsrc) 

該函式的引數是字元指標,也就是可以是字串變數和字元陣列,因為它們的變數名代表首字元位址。字串預設有乙個null結束符,字元陣列沒有。所以此處需要注意:因為src要求有null結束符,所以字元陣列的長度必須大於等於src包含null結束符的總長度。例如,char* src="abcd"; char dest[5]; 這裡dest的長度就至少為5。

2. strncpy函式:多個n代表可以指定字元個數進行賦值。原型:char * strncpy(char *dest, char *src, size_tn);  功能:將字串src中最多n個字元複製到字元陣列dest中(它並不像strcpy一樣遇到null才停止複製,而是等湊夠n個字元才開始複製),返回指向dest的指標。要求:如果n > dest串長度,dest棧空間溢位產生崩潰異常。該函式注意的地方和strcpy類似,但是n值需特別注意,

1)src串長度<=dest串長度,(這裡的串長度包含串尾null字元) 

如果n=(0, src串長度),src的前n個字元複製到dest中。但是由於沒有null字元,所以直接訪問dest串會發生棧溢位的異常情況。這時,一般建議採取memset將dest的全部元素用null填充,如:memset(dest,0,7)(7為從dest起始位址開始前7個位置填充null,dest可以為字元指標和陣列名)。注意:char* pc="abc"; char chs[5]; sizeof(pc)為4(包含null)(有些編譯器不行),sizeof(chs)為5。

如果n = src串長度,與strcpy一致。 

如果n = dest串長度,[0,src串長度]處存放於desk字串,(src串長度, dest串長度]處存放null。 

2)src串長度》dest串長度 

如果n =dest串長度,則dest串沒有null字元,會導致輸出會有亂碼。如果不考慮src串複製完整性,可以將dest最後一字元置為null。

所以,一般把n設為dest(含null)的長度(除非將多個src複製到dest中)。當2)中n=dest串長度時,定義dest為字元陣列,因為這時沒有null字元拷貝。

strcpy和strncpy的區別

strcpy 原型 char strcpy char restrict s1,const char restrict s2 用法 include 功能 把s2所指由null結束的字串複製到s1所指的陣列中。說明 s1和s2所指記憶體區域不可以重疊且s1必須有足夠的空間來容納s2的字串。返回指向s1的...

strcpy和strncpy的區別

第一種情況 1 2 3 4 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 ...

strcpy 和 strncpy的區別

strcpy 字串複製 原型 char strcpy char dest,char src 功能 把src所指由 0 結束的字串複製到dest所指的陣列中。說明 src和dest所指記憶體區域不可以重疊且dest必須有足夠的空間來容納src的字串。返回指向dest的指標。注意 當src串長度 des...