strcpy 和 strncpy的區別

2021-09-30 07:40:44 字數 1673 閱讀 3969

strcpy:字串複製

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

功能:把src所指由'/0'結束的字串複製到dest所指的陣列中。

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

返回指向dest的指標。

注意:當src串長度》dest串長度時,程式仍會將整個src串複製到dest區域,可是dest陣列已發生溢位。

因此會導致dest棧空間溢位以致產生崩潰異常。如果不考慮src串的完整性,可以把dest陣列最後一元素置為null,從dest串長度處插入null擷取字串。

原型:char * strncpy(char *dest, char *src, size_t n);

功能:將字串src中最多n個字元複製到字元陣列dest中(它並不像strcpy一樣遇到null就開始複製,而是等湊夠n個字元才開始複製),返回指向dest的指標。

說明:如果n > dest串長度,dest棧空間溢位產生崩潰異常。

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

如果n=(0, src串長度),src的前n個字元複製到dest中。但是由於沒有null字元,所以直接訪問dest串會發生棧溢位的異常情況。

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

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

2)src串長度》dest串長度

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

綜上,一般情況下,使用strncpy時,建議將n置為dest串長度(除非你將多個src串都複製到dest陣列,並且從dest尾部反向操作),複製完畢後,為保險起見,將dest串最後一字元置null,避免發生在第2)種情況下的輸出亂碼問題。當然嘍,無論是strcpy還是strncpy,保證src串長度附:

strcpy和strncpy的區別- -

第一種情況:

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 ? " ====>正確!

strncpy(name,p, sizeof(name));//name改變為"how are you ?" *****>正確!後續的字元將置為null

第二種情況:

char* p="how are you ?";

char name[10];

strcpy(name,p); //目標串長度小於源串,錯誤!

name[sizeof(name)-1]='/0'; //和上一步組合,彌補結果,但是這種做法並不可取,因為上一步出錯處理方式並不確定

strncpy(name,p,sizeof(name)); //源串長度大於指定拷貝的長度sizeof(name),注意在這種情況下不會自動在目標串後面加'/0'

name[sizeof(name)-1]='/0'; //和上一步組合,彌補結果

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 ...

strncpy 和strcpy的區別

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