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


strcpystrncpymemcpy的區別與使用方法

strcpy、strncpy、memcpy這三個C語言函數我們在主機代碼編寫中會很頻繁的使用到,但是三個函數的區別、使用時該注意什麼還是有必要說下的。

本文參考《C 標準庫》編寫。

一、函數說明

1、memcpy函數

void  *memcpy(void *s1,  const void *s2,  size_t  n);

說明:

函數memcpy從s2指向的對象中複製n個字符到s1指向的對象中。如果複製發生在兩個重疊的對象中,則這種行爲未定義。

返回值:

函數memcpy返回s1的值。

2、strcpy函數

char  *strcpy(char *s2, const char *s1);

說明:

函數strcpy把s1指向的串(包括空字符)複製到s2指向的數組中。如果複製發生在兩個重疊的對象中,則這種行爲未定義。

返回值:

函數strcpy返回s2的值。

3、strncpy函數

char  *strncpy(char *s2, const char *s1, size_t n);

說明:

函數strncpy從s1指向的數組中最多複製n個字符(不復制空字符後面的字符)到s2指向的數組中。如果複製發生在兩個重疊的對象中,則這種行爲未定義。

如果s1指向的數組是一個比n短的字符串,則在s2定義的數組後面補空字符,直到寫入了n個字符。

返回值:

函數strncpy返回s2的值。

二、注意事項

strcpy 是依據 “\0” 作爲結束判斷的,如果 s2 的空間不夠,則會引起 buffer overflow。

memcpy用來在內存中複製數據,由於字符串是以“\0”結尾的,所以對於在數據中包含“\0”的數據只能用memcpy。

Strncpy和memcpy很相似,只不過它在一個終止的空字符處停止。當n>strlen(s1)時,給s2不夠數的空間裏填充“\0”;當n<=strlen(s1)時,s2是沒有結束符“\0”的。

這裏隱藏了一個事實,就是s2指向的內存一定會被寫n個字符。

所以總的來說注意:

1、s2指向的空間要足夠拷貝;使用strcpy時,s2指向的空間要大於等於s1指向的空間;使用strncpy或memcpy時,s2指向的空間要大於或等於n。

2、使用strncpy或memcpy時,n應該大於strlen(s1),或者說最好n >= strlen(s1)+1;這個1 就是最後的“\0”。

3、使用strncpy時,確保s2的最後一個字符是“\0”。



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