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中,返回函數。
區別:
第一種情況:
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'