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截取字串。
strncpy:字串複製
原型: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串長度]處存放於desk字串,(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串長度<dest串長度纔是最重要的。
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 ?" =====>正確!後續的字符將置爲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'; //和上一步組合,彌補結果
參考:http://baike.baidu.com/view/1207711.htm