詳解C語言中strcpy函數(shù)與memcpy函數(shù)的區(qū)別與實現(xiàn)
字符串拷貝函數(shù)(strcpy)
函數(shù)原型
由圖可知,strcpy的形參是(目的地址,來源地址),返回值為char *。
應(yīng)用實例
我們將一個存放“abcdefg”的字符數(shù)組arr的內(nèi)容拷貝到字符數(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)拷貝,那怎么辦呢?我們可以使用內(nèi)存拷貝函數(shù),不管三七二十一,你在這個內(nèi)存單元上,我就把你拷貝過去,這樣便實現(xiàn)了任意類型的拷貝 。
內(nèi)存拷貝函數(shù)(memcpy)
函數(shù)原型
由圖可知,memcpy的返回類型是void*,它的形參是(目標(biāo)地址,需要復(fù)制的地址,字節(jié)大?。?/p>
應(yīng)用實例
我們依然將一個存放“abcdefg”的字符數(shù)組arr的內(nèi)容拷貝到字符數(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*指的是什么,所以需要強制類型轉(zhuǎn)換。而強制類型轉(zhuǎn)換,換成什么類型好呢?如果我們用int型,我們知道一個int元素占4個字節(jié),那我們需要復(fù)制3個字節(jié)的東西咋辦?所以,我們用只占一個字節(jié)的char型。
*(char*)dest = *(char*)src;
在拷貝完一個字節(jié)之后,指針向后移動一個字節(jié)
dest = (char*)dest + 1; src = (char*)src + 1;
那么我們?nèi)绾慰刂瓶截惗嗌賯€字節(jié)呢?用while搭配count就行。
while (count--) { *(char*)dest = *(char*)src; dest = (char*)dest + 1; src = (char*)src + 1; }
函數(shù)運行完了,我們隨便返回一個值就行。
return 0;
到此這篇關(guān)于詳解C語言中strcpy函數(shù)與memcpy函數(shù)的區(qū)別與實現(xiàn)的文章就介紹到這了,更多相關(guān)C語言 strcpy memcpy內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++類與對象深入之引用與內(nèi)聯(lián)函數(shù)與auto關(guān)鍵字及for循環(huán)詳解
朋友們好,這篇播客我們繼續(xù)C++的初階學(xué)習(xí),現(xiàn)在對一些C++的入門知識做了些總結(jié),整理出來一篇博客供我們一起復(fù)習(xí)和學(xué)習(xí),如果文章中有理解不當(dāng)?shù)牡胤?還希望朋友們在評論區(qū)指出,我們相互學(xué)習(xí),共同進步2022-06-06