C語言的四種拷貝函式

2021-09-28 15:04:32 字數 2848 閱讀 1251

標頭檔案:#include

一、strcpy函式

strcpy()函式用來複製字串,其原型為:char*strcpy(char *dest, const char *src);

【引數】dest 為目標字串指標,src為源字串指標。

注意:src 和 dest 所指的記憶體區域不能重疊,且 dest必須有足夠的空間放置 src 所包含的字串(包含結束符null)。

【返回值】成功執行後返回目標陣列指標 dest。

strcpy() 把src所指的由null結束的字串複製到dest 所指的陣列中,返回指向dest 字串的起始位址。

注意:如果引數 dest 所指的記憶體空間不夠大,可能會造成緩衝溢位(bufferoverflow)的錯誤情況,在編寫程式時需要特別留意,或者用strncpy()來取代。

c code :

#include 

#include 

int main ()

執行結果:

str1: sample string

str2: sample string

str3: copy successful

二、memcpy函式

memcpy() 用來複製記憶體,其原型為:

void *memcpy ( void * dest, const void * src, size_t num );

memcpy() 會複製 src 所指的記憶體內容的前 num 個位元組到 dest所指的記憶體位址上。

memcpy()並不關心被複製的資料型別,只是逐字節地進行複製,這給函式的使用帶來了很大的靈活性,可以面向任何資料型別進行複製。

需要注意的是:

dest 指標要分配足夠的空間,也即大於等於 num位元組的空間。如果沒有分配空間,會出現斷錯誤。

dest 和 src所指的記憶體空間不能重疊(如果發生了重疊,使用 memmove() 會更加安全)。與 strcpy() 不同的是,memcpy() 會完整的複製 num個位元組,不會因為遇到「\0」而結束。

返回值】返回指向 dest 的指標。注意返回的指標型別是void,使用時一般要進行強制型別轉換。

處理記憶體重疊時的情況:先將內容複製到類似緩衝區的地方,再用緩衝區中的內容覆蓋 dest指向的記憶體,請看下圖。

c code :

#include  

#include  

#include  

#define n (10)

int main()

執行結果:

p2 = abcde

p3 = abcde

**說明:

1)**首先定義p1,p2,p3三個指標,但略有不同,p1指向乙個字串字面值,給p2分配了10個位元組的記憶體空間。

2)指標p3通過函式memcpy直接指向了指標p2所指向的記憶體,也就是說指標p2、p3指向了同一塊記憶體。然後列印p2,p3指向的記憶體值,結果是相同的。

3)最後按照好的習慣釋放p2,並把p3也置為null是為了防止再次訪問p3指向的記憶體,導致野指標的發生。

三、memmove函式

memmove() 用來複製記憶體內容,其原型為:

void *memmove(void *dest, const void *src, size_t num);

說明:memmove() 與 memcpy() 類似都是用來複製 src所指的記憶體內容前 num 個位元組到 dest 所指的位址上。不同的是,memmove() 更為靈活,當src 和 dest所指的記憶體區域重疊時,memmove() 仍然可以正確的處理,不過執行效率上會比使用 memcpy()略慢些。

ccode :

#include  

#include  

#include  

int main ()

執行結果:

memmove can be very very useful.

處理記憶體重疊時的情況:先將內容複製到類似緩衝區的地方,再用緩衝區中的內容覆蓋 dest指向的記憶體,請看下圖。

四、strncpy函式

strncpy()用來複製字串的前n個字元,其原型為:

char *strncpy(char *dest, const char *src, size_t n);

【引數說明】dest 為目標字串指標,src 為源字串指標。

strncpy()會將字串src前n個字元拷貝到字串dest。

不像strcpy(),strncpy()不會向dest追加結束標記'\0',這就引發了很多不合常理的問題,將在下面的示例中說明。

注意:src 和 dest 所指的記憶體區域不能重疊,且 dest必須有足夠的空間放置n個字元。使用strncpy()最安全方式是使n等於strlen(src)+1,即拷貝整個字串,同時將'\0'追加到dest。

返回值】返回字串dest。

c code :

#include

#include  

int main(void)

五、參考資料

c語言中文網--函式手冊

C 拷貝建構函式的四種呼叫時機

假設定義了乙個類a class a void main void main void f a p void main g函式返回的是乙個元素 複雜型別的 返回的是乙個新的匿名物件 所以會呼叫匿名物件類的copy建構函式 a g void main 注意 1.只有乙個物件對另乙個同型別的物件進行初始化...

陣列拷貝的四種方式

第一種方式也是最常見的方式 for迴圈 public class test int newarr copyof arr system.out.println arrays.tostring newarr public static int copyof int arr return arr2 返回乙...

C語言中的四種常量

說明 常量在c語言中是不能被改變的量 1.字面常量 例如 整數 1,2,4,34,小數 3.14等。2.const修飾的常變數 變數被const修飾後會具有常量不可被修改的屬性,但其本質依然是乙個變數 define crt secure no warnings 1 include include i...