「解剖」複製類函式

2021-08-19 20:18:11 字數 2314 閱讀 4961

一、strcpy()函式:

函式原型:char * strcpy(char * str1,char * str2)

函式功能:將str2指向的字串複製到str1中去

返回值:返回str1

包含檔案:string.h

注意:strcpy()根據\0作為判斷結束,如果引數 str1 所指的記憶體空間不夠大,可能會造成緩衝溢位(buffer overflow)的錯誤情況,使用strncpy()或許更加安全。

strcpy()源**如下:

方法一:

int main()

str1[i] = '\0';

printf("%s \n",str1);

}方法二:借助下標

void my_strcpy(char *str1,char *str2)

str1[i] = '\0';

}void main()

執行結果:

方法三:不借助外力

void my_strcpy(char *str1,char *str2)

*str1 = '\0';

}void main()

執行結果如上。

方法四:改進方法二

void my_strcpy(char *str1,char *str2)

二、memcpy()函式

與strcpy()函式的區別:

strcpy()總是與字串是相對應的,該函式複製的內容為字串,然而字串在複製的時候通常使用該函式。該函式遇到字串的結束符\0即結束,容易導致溢位。

memcpy()可以複製任意的內容,比如:結構體、字元陣列、整型等,使用的物件型別廣泛,然而,除了字串以外的其他函式在複製時通常使用該函式,然而,其複製的長度根據第三個引數來決定。

函式原型:void *memncpy(void *di,void *si,int n)

memcpy()源**如下:

方法一:

int main()

;char p[10];

int size = sizeof(s);

int i = 0;

for( ;i < size;++i)

p[i] = '\0';

printf("%s \n",p);

}方法二:

void *my_memcpy(void *di,void *si,int size)

return di;

}void main()

;char ar[10];

my_memcpy(ar,buff,sizeof(buff));

printf("%s \n",ar);

}方法三:

void *my_memcpy(void *di,void *si,int size)

return di;

}void main()

;char ar[10];

my_memcpy(ar,buff,sizeof(buff));

printf("%s \n",ar);

}三、strncpy()

函式函式功能:複製字串,但是不限制複製的數量,可以選擇一段字元進行複製輸出。

函式原型:char *strncpy(char *di,char *si,size_t n).

這裡注意:

如果*si的字串長度<=*di的字串長度,

如果n>*si由於長度達到si nul,正常複製,但是,如果si中有null,strncpy複製到null即使沒到n也提前停止。如果n = *si串長度,與strcpy一致。注意n的選擇當n > *di串長度,di棧空間溢位產生崩潰異常。

如果*si

串長度》*di串長度

若n =*di串長度,則*di串沒有null字元,會導致輸出會有亂碼。如果不考慮*si串複製完整性,可以將*di 最後一字元置為null。

因此,一般情況下,使用strncpy時,建議將n置為*di串長度

strncpy()函式源**如下:

方法一:

void main()

p[i] = '\0';

printf("%s \n",p);

}方法二:使用下標

char *strncpy(char *di,char *si,int n)

di[i] = '\0';

return di;

}void main()

剩下的不使用下標,或者使用指標進行加減,等同前兩個複製函式相似,這裡不再給出詳細的**。

我是程式設計小白乙隻,初次涉獵程式設計,麻煩讀者多多指正不足之處。

c 類 建構函式 複製建構函式

複製建構函式是一種特殊的建構函式,它的作用是用乙個已經存在的物件去初始化另乙個物件。一般情況下不需要自行定義複製建構函式,系統預設提供乙個逐個複製成員值的複製建構函式。何時要使用呢?1.將新物件初始化為乙個同類物件 2.按值將物件傳遞給函式 3.函式按值返回物件 4.編譯器生成臨時物件 簡單的樣例如...

類與物件 複製建構函式

二進位制複製不複製指向的記憶體單元,這導致兩個 mystring 物件指向同乙個記憶體單元。函式 usemystring 返回時,變數 str 不再在作用域內,因此被銷毀。為此,將呼叫 mystring 類的析構函式,而該析構函式使用 delete釋放分配給 buffer 的記憶體,這將導致 mai...

類和物件 複製建構函式

形如x x x 或x x const x 二選一,後者能以常量物件作為引數 class complex complex c1 呼叫預設無參建構函式 complex c2 c1 呼叫預設的複製建構函式,將 c2 初始化成和c1一樣class complex complex const complex ...