C strcpy和strncpy用法和區別

2021-08-20 05:05:00 字數 1459 閱讀 7831

#ifndef null

#ifdef __cplusplus

#define null 0

#else

#define null ((void *)0)

#endif

#endif

strcpy函式:顧名思義字串複製函式;

原型:extern char *strcpy(char *dest,char *src);

要求:src和dest所指記憶體區域不可以重疊且dest必須有足夠的空間來容納src的字串。

一般函式原型實現方式:

char * strcpy(char * strdest,const

char * strsrc)

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

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字元拷貝。

C strcpy與strncpy的注意事項

strcpy的函式式為 strcpy dst,src 因為char陣列最後以 0 為結尾,所以需要注意的是如果strlen src strlen dst 時,則最後的 0 無法複製,則會導致出錯,即dst的大小至少要等於src的大小,保證strcpy能複製最後的 0 strncpy的函式式為 str...

memcpy strcpy和strncpy的簡介

在c的操作中,對陣列類資料進行批量賦值一般通過memcpy strcpy和strncpy這三種函式進行,這裡將為其進行介紹.這三者的區別在於strcpy和strncpy只能對字串的資料進行拷貝,無法用於拷貝中間含有null的資料。函式的標頭檔案 string.h 1.memcpy 函式名 void ...

strcpy和strncpy用法和區別

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