strcpy、strncpy與memcpy的區別與使用方法


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,如:"hell\0oworld"。

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”。

 

轉自:http://blog.csdn.net/taric_ma/article/details/7383713


免責聲明!

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



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