1. 程式人生 > >strncpy 和strcpy的區別

strncpy 和strcpy的區別

1. strcpy函式:顧名思義字串複製函式:原型:extern char *strcpy(char *dest,char *src); 功能:把從src地址開始且含有NULL結束符的字串賦值到以dest開始的地址空間,返回dest(地址中儲存的為複製後的新值)。要求:src和dest所指記憶體區域不可以重疊且dest必須有足夠的空間來容納src的字串。
  一般函式原型實現方式:
  char * strcpy(char * strDest,const char * strSrc) 
  { 
  char * strDestCopy=strDest; //[3] 

  if ((strDest==NULL)||(strSrc==NULL)) //[1] 
  throw "Invalid argument(s)"; //[2] 
  while ((*strDest++=*strSrc++)!='\0'); //[4] 
  return strDestCopy; 
  } 
  該函式的引數是字元指標,也就是可以是字串變數和字元陣列,因為它們的變數名代表首字元地址。字串預設有一個null結束符,字元陣列沒有。所以此處需要注意:因為src要求有null結束符,所以字元陣列的長度必須大於等於src包含null結束符的總長度。例如,char* src="abcd"; char dest[5]; 這裡dest的長度就至少為5。

2. strncpy函式:多個n代表可以指定字元個數進行賦值。原型:char * strncpy(char *dest, char *src, size_tn);  功能:將字串src中最多n個字元複製到字元陣列dest中(它並不像strcpy一樣遇到NULL才停止複製,而是等湊夠n個字元才開始複製),返回指向dest的指標。要求:如果n > dest串長度,dest棧空間溢位產生崩潰異常。該函式注意的地方和strcpy類似,但是n值需特別注意,
  1)src串長度<=dest串長度,(這裡的串長度包含串尾NULL字元) 
  如果n=(0, src串長度),src的前n個字元複製到dest中。但是由於沒有NULL字元,所以直接訪問dest串會發生棧溢位的異常情況。這時,一般建議採取memset將dest的全部元素用null填充,如:memset(dest,0,7)(7為從dest起始地址開始前7個位置填充null,dest可以為字元指標和陣列名)。注意:char* pc="abc"; char chs[5]; sizeof(pc)為4(包含null)(有些編譯器不行),sizeof(chs)為5。

  如果n = src串長度,與strcpy一致。 
  如果n = dest串長度,[0,src串長度]處存放於desk字串,(src串長度, dest串長度]處存放NULL。 
  2)src串長度>dest串長度 
  如果n =dest串長度,則dest串沒有NULL字元,會導致輸出會有亂碼。如果不考慮src串複製完整性,可以將dest最後一字元置為NULL。
  所以,一般把n設為dest(含null)的長度(除非將多個src複製到dest中)。當2)中n=dest串長度時,定義dest為字元陣列,因為這時沒有null字元拷貝。