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'結束符,所以是不安全的,複製完後需要手動新增字串的結束符才行。
區別:
第一種情況:
1char* 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 ?
第二種情況:
1char* p="
how are you ?";2
char name[20];
strcpy(name,p); //name改變為"how are you ? " ====>正確!
strncpy(name,p,sizeof(name)); //name改變為"how are you ? " ====>正確!
第三種情況:
1char* 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的...