strcpy和strncpy用法和區別


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字符拷貝。


免責聲明!

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



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