小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

strcpy與memcpy以及strncpy

 水中麒麟 2013-09-13

1. strcpy函數(shù)

   strcpy提供了字符串的復(fù)制。即strcpy只用于字符串復(fù)制,并且它不僅復(fù)制字符串內(nèi)容之外,還會復(fù)制字符串的結(jié)束符。

   函數(shù)原型及實現(xiàn):

[c-sharp] view plaincopy
  1. char* strcpy(char* strDst, const char* strSrc)      
  2. {  
  3.     assert((strDst != NULL) && (strSrc != NULL));  
  4.     char* address = strDst;      // 保存Dest 的首地址,以便返回
  5.     while((*strDst++ = *strSrc++) != '/0');  
  6.     return address;  
  7.   }  
  

 

  注意:

  1. 該函數(shù)會連同字符串的結(jié)束字符'/0'一起拷貝到字符數(shù)組中,故字符數(shù)組的長度應(yīng)該至少是字符串的長度加1。

  例:

  char str[] = "123456";

  這里str是一個字符數(shù)組,它存放了一個字符串"123456",由于字符串還有一個結(jié)束符"/0",所以此數(shù)組的長度為7而不是6。

 

   char *str = "123456";  //該字符串的長度為6(字符串以字符'/0'結(jié)尾,不計入字符串長度)

   char   dst[7];   //字符數(shù)組的長度必須至少為字符長度加1,如6+1=7。

   strcpy(dst, str);

  2. 該函數(shù)會拷貝字符串的內(nèi)容直至遇到第一個字符值為0的字符(第一個字符值為0的字符也會被拷貝),故如果一個字符串或字符數(shù)組含

     有大量的值為0的數(shù)據(jù),則不宜用該函數(shù)進行拷貝操作,可用memcpy函數(shù)。

 

2. memcpy函數(shù)

   memcpy提供了一般內(nèi)存的復(fù)制。即memcpy對于需要復(fù)制的內(nèi)容沒有限制,因此用途更廣。

   該函數(shù)將一個大小為size的內(nèi)存段的值拷貝到另一內(nèi)存段中。

   其實現(xiàn)如下:

[c-sharp] view plaincopy
  1. void *memcpy(void *memTo, const void *memFrom, size_t size)     
  2. {  
  3.     assert((memTo != NULL) && (memFrom != NULL)); //memTo和memFrom必須有效  
  4.     char *tempFrom = (char *)memFrom;             //保存memFrom首地址  
  5.      char *tempTo = (char *)memTo;                  //保存memTo首地址  
  6.     while(size -- > 0)                //循環(huán)size次,復(fù)制memFrom的值到memTo中  
  7.         *tempTo++ = *tempFrom++ ;   
  8.     return memTo;   
  9. }  
  

 

 

3. strcpy與memcpy的區(qū)別

  3.1 復(fù)制的內(nèi)容不同。

     strcpy只能復(fù)制字符串,而memcpy可以復(fù)制任意內(nèi)容,例如字符數(shù)組、整型、結(jié)構(gòu)體、類等。

  3.2 復(fù)制的方法不同。

     strcpy不需要指定長度,它遇到字符串結(jié)束符"/0"便結(jié)束。memcpy則是根據(jù)其第3個參數(shù)決定復(fù)制的長度。

  3.3 用途不同。

     通常在復(fù)制字符串時用strcpy,而需要復(fù)制其他類型數(shù)據(jù)時則一般用memcpy。

 

4. strncpy

strncpy的實現(xiàn)如下

[c-sharp] view plaincopy
  1. char *strncpy(char *dst, const char *src, size_t count)  
  2. {  
  3.         assert((dst != NULL) && (src != NULL));  
  4.         char *tmp = dst;  
  5.   
  6.         while (count-- && (*dst++ = *src++) != '/0')  
  7.         {  
  8.                 /* nothing */;  
  9.         }  
  10.   
  11.         return tmp;  
  12. }  

 

該函數(shù)用于拷貝count個字符。

 

注意:

1. count一定要小于dst的大小。

2.調(diào)用完該函數(shù)后一定要加上一句:dst[count] = '/0';否則不安全,如strlen等函數(shù)要求參數(shù)必須是以'/0'結(jié)尾的字符串。

   因為當count小于src的大小時,src的結(jié)束字符'/0'并不會被拷貝,故應(yīng)該為dst加上一個結(jié)束符。

例:

[c-sharp] view plaincopy
  1. char *str = "123456";  
  2.   
  3. char dst[7];  
  4.   
  5. int count = 6;  
  6.   
  7. strncpy(dst, str, count);  //count=6一定要小于dst的長度(7)。  
  8.   
  9. dst[count] = '/0';  
        

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多