strcpy與strncpy工作方式及其區別


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';//和上一步組合,彌補結果

strncpy
如果目標長>指定長>源長,則將源長全部拷貝到目標長,自動加上'/0'
如果指定長<源長,則將源長中按指定長度拷貝到目標字符串,不包括'/0',
如果指定長>目標長,error happen!

 

 總結:

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

strncpy()以第三個參數N為拷貝結束標志,如果source的長度小於N,則剩余的字符全部用'\0'填充.

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM