strcpy與strncpy工作方式及其區別

2021-06-25 20:48:58 字數 1870 閱讀 3198

strcpy中的迴圈語句:

while ((*strdest++ = *strsrc++) != '

\0')

這個迴圈會一直執行,直到迴圈條件為空,即'\0',也就是說,如果strdest所指的儲存空間不夠大的話,這個函式會將strsrc中的部分內容拷貝到strdest所指記憶體空間後面的記憶體中。而strdest所指空間後面的記憶體卻是不可知的,有可能已經被其他資源占用了,這樣就會破壞原先儲存的內容,導致系統崩潰。

因為strcpy在執行字串拷貝的時候,會從strsrc所指位置開始,檢測當前記憶體單元中儲存的資料是否為'\0'。如果不為'\0',則將這個記憶體單元中的資料拷貝到strdest所指向的記憶體中。如果strsrc中儲存的字串長度大於dst所申請的記憶體空間的話,就會產生越界,造成不可預知的後果。

strncpy的函式原型:

char *strncpy(char *dest, const char *src,int count)

函式功能

將字串src中的count個字元拷貝到字串dest中去。返回指向s1的指標

用法解析:

這個函式和strcpy類似,當src的長度大於dst申請的空間的時候,情況和strcpy一樣;

如果第3個引數count的值大於src中字串的長度的話,就會將字串src拷貝到dst中,返回函式。

注意:如果源串長度大於n,則strncpy不複製最後的'\0'結束符,所以是不安全的,複製完後需要手動新增字串的結束符才行。

區別:

第一種情況:

1

char* p="

how are you ?";2

char name[20]="

abcdefghijklmnopqrs

";

strcpy(name,p);   //name改變為"how are you ? "     ====>正確!

strncpy(name,p,sizeof(name))    //name改變為"how are you ?      "       ====>正確!

經過vc驗證:兩種都是how are you ?

第二種情況:

1

char* p="

how are you ?";2

char name[20];

strcpy(name,p);    //name改變為"how are you ? "     ====>正確!

strncpy(name,p,sizeof(name));        //name改變為"how are you ?      "      ====>正確!

第三種情況:

1

char* p="

how are you ?";2

char name[10];

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

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

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

總結:

strcpy(),以源串中的'/0'為拷貝結束標誌,直到遇到該'\0'為止,然後將'\0'拷貝上.

strncpy()以第三個引數n為拷貝結束標誌,如果source的長度小於n,則剩餘的字元全部用'\0'填充.

如果source的長度大於n,則從source中擷取前n個字元,拷貝過去.不包括'\0'

strcpy與strncpy的區別

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

strncpy與strcpy的區別與注意事項

strncpy 是 c語言 的庫函式之一,來自 c語言標準庫,定義於 string.h char strncpy char dest,char src,int n 把src所指字串的前n個位元組複製到dest所指的陣列中,並返回指向dest的指標。strcpy只是複製字串,但不限制複製的數量,很容易...

strcpy和strncpy的區別

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