strcpy與strncpy聯繫與區別?

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 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章