詳解C語言中strcpy函數(shù)與memcpy函數(shù)的區(qū)別與實現(xiàn)
字符串拷貝函數(shù)(strcpy)
函數(shù)原型

由圖可知,strcpy的形參是(目的地址,來源地址),返回值為char *。
應用實例
我們將一個存放“abcdefg”的字符數(shù)組arr的內容拷貝到字符數(shù)組brr之中。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int main()
{
char arr[10] = "abcdefg";
char brr[10] = { 0 };
strcpy(brr, arr);
printf("%s", brr);
return 0;
}
缺點
如果不是字符類型,還能這樣拷貝嗎?

我們發(fā)現(xiàn),編譯器直接報錯了,因為形參跟實參不兼容。 strcpy具有局限性,只能適用于字符類型的拷貝。我們想要任意類型的都能實現(xiàn)拷貝,那怎么辦呢?我們可以使用內存拷貝函數(shù),不管三七二十一,你在這個內存單元上,我就把你拷貝過去,這樣便實現(xiàn)了任意類型的拷貝 。
內存拷貝函數(shù)(memcpy)
函數(shù)原型

由圖可知,memcpy的返回類型是void*,它的形參是(目標地址,需要復制的地址,字節(jié)大?。?/p>
應用實例
我們依然將一個存放“abcdefg”的字符數(shù)組arr的內容拷貝到字符數(shù)組brr之中。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int main()
{
char arr[10] = "abcdefg";
int ret = strlen(arr);//求出字符串的長度
char brr[10] = { 0 };
memcpy(brr, arr,ret*sizeof(char));//字節(jié)數(shù)=個數(shù)*數(shù)據(jù)類型大小
printf("%s", brr);
return 0;
}
這次我們試試整型數(shù)組能不能拷貝過去。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int main()
{
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
int brr[10] = { 0 };
memcpy(brr, arr, 10*4);//字節(jié)數(shù)=個數(shù)*數(shù)據(jù)類型大小
for (int i = 0; i < 10; i++)
{
printf("%d ", brr[i]);
}
return 0;
}
成功了,這說明memcpy的適用范圍強于strcpy,那么memcpy是怎么實現(xiàn)的呢?
memcpy的模擬實現(xiàn)(my_memcpy)
實現(xiàn)樣例
void* my_memcpy(void* dest, void* src, size_t count)
{
void* ret=dest;
while (count--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
return ret;
}
首先觀察它形式

我們依葫蘆畫瓢,也寫出類似的函數(shù)形式。
void* my_memcpy(void* dest, void* src, size_t count)
具體實現(xiàn)
因為我們用的都是void*來接受參數(shù),目的是保證兼容性(畢竟你不知道使用者使用的時候用的是什么數(shù)據(jù)類型),但計算機不知道void*指的是什么,所以需要強制類型轉換。而強制類型轉換,換成什么類型好呢?如果我們用int型,我們知道一個int元素占4個字節(jié),那我們需要復制3個字節(jié)的東西咋辦?所以,我們用只占一個字節(jié)的char型。
*(char*)dest = *(char*)src;
在拷貝完一個字節(jié)之后,指針向后移動一個字節(jié)
dest = (char*)dest + 1; src = (char*)src + 1;
那么我們如何控制拷貝多少個字節(jié)呢?用while搭配count就行。
while (count--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
函數(shù)運行完了,我們隨便返回一個值就行。
return 0;
到此這篇關于詳解C語言中strcpy函數(shù)與memcpy函數(shù)的區(qū)別與實現(xiàn)的文章就介紹到這了,更多相關C語言 strcpy memcpy內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

